
    j                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZ 	 d dlZn# e$ r dZY nw xY wd dlZd dlZd dlmZmZmZmZ d dlmZ d dlmZ 	 d dlmZ d dlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( n## 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 nw xY wej*        j        Z+d Z,d	 Z-d
 Z.d Z/d Z0d Z1d Z2 G d de!          Z3 G d de!          Z4 G d de!          Z5 G d de5          Z6 G d de5          Z7 G d de5          Z8 G d de!          Z9 G d de!          Z: G d d e!          Z; G d! d"e!          Z< G d# d$e!          Z= G d% d&e!          Z> G d' d(e!          Z? G d) d*e!          Z@ G d+ d,e!          ZA G d- d.e"          ZB G d/ d0e#          ZC G d1 d2e"          ZD G d3 d4e#          ZE G d5 d6e"          ZFd7 ZG G d8 d9e'          ZH G d: d;e&          ZI G d< d=e%          ZJ G d> d?e$          ZK G d@ dAe!          ZL G dB dCe%          ZM G dD dEe$          ZN G dF dGe!          ZO G dH dIe$          ZP G dJ dKe%          ZQ G dL dMe!          ZR G dN dOe!          ZS G dP dQe%          ZT G dR dSe'          ZU G dT dUe&          ZV G dV dWe%          ZW G dX dYe'          ZX G dZ d[e'          ZY G d\ d]e&          ZZ G d^ d_e%          Z[ G d` dae$          Z\ G db dce!          Z]dd Z^de Z_df Z`dg Zadh Zbej*        j
        ej*        jc        di                         Zddj Zedk Zfdl Zgej*        jh        dm             Zidn Zjdo Zkdp Zldq Zmdr Zn G ds dte!          Zodu Zpdv Zqdw Zrej*        s                    ejt        dxk    dyz          d{             Zuej*        jc        d|             Zvd} Zwd~ Zxd Zyd Zzd Z{d Z|d Z}d Z~d Zd Z eBddi          Z eDddi          Zej*        jc        d             Zej*        s                    ejt        dxk    dz          d             Zd Zd Zd Z eJ            Z eF            Zd Zd Zd Zd Zd Zd Zd Zej*        jc        ej*        j        d                         Zej*        j        d             Zej*        j        d             Zej*        j        d             Zd Zd Zd Zd Zej*        j        d             Zej*        jc        d             Zej*        j
        ej*        jc        d                         Zd Zd Zd Zd Zd Zd Zd Zd Zej*        j        d             Zd Zd Zd Zd Zd Zd Zej*        j        d             Z G d de!          Zej*        j
        d             Zd Zej*        j        ej*        jc        d                         Zej*        j        ej*        jc        d                         Z G d de5          Zd Zej*        jc        d             Zd Z G d de!          Zd Zej*        s                    ej        dk    dz          d             ZdÄ ZdĄ Zdń Zej        dƄ             Zej*                            dddgdʬ˦          d̄             ZdS )    N)datetime)IpcReadOptions	ReadStatsis_opentelemetry_enabledtobytes)find_free_port)util)flight)	FlightClientFlightServerBaseServerAuthHandlerClientAuthHandlerServerMiddlewareServerMiddlewareFactoryClientMiddlewareClientMiddlewareFactoryFlightCallOptionsc                      dd l } d S )Nr   )pyarrow.flight)pyarrows    c/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/pyarrow/tests/test_flight.pytest_importr   C   s        c                      t           j                            d          st          d          t	          j        t           j        d                   dz  S )z-Get the path to the test resources directory.ARROW_TEST_DATAzITest resources not found; set ARROW_TEST_DATA to <repo root>/testing/datar
   )osenvirongetRuntimeErrorpathlibPath r   r   resource_rootr#   H   sR    :>>+,, J I J J 	J<
#4566AAr   c                 "   t                      }|sdS 	 || z                      d          5 }|                                cddd           S # 1 swxY w Y   dS # t          $ r* t	          d|| z   dt          j                               w xY w)z)Get the contents of a test resource file.NrbzTest resource z< not found; did you initialize the test resource submodule?
)r#   openreadFileNotFoundErrorr   	traceback
format_exc)pathrootfs      r   read_flight_resourcer.   P   s    ??D t
Tk%% 	6688	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 
 
 
BTD[ B B)2)=)?)?B B
 
 	

s.   A A A AA AA 4Bc                      t          d          t          j        t          d          t          d                    t          j        t          d          t          d                    gdS )z'Get the paths to test TLS certificates.zroot-ca.pemz	cert0.pemz	cert0.key)certkeyz	cert1.pemz	cert1.key)	root_certcertificates)r.   r
   CertKeyPairr"   r   r   example_tls_certsr5   _   s{     *-88)+66(55   )+66(55  	
  r   c                  t    t          j        g d          g} t           j                            | dg          S )Nir      
   	some_intsnames)paarrayTablefrom_arrays)datas    r   simple_ints_tablerC   p   s<    
$$$%%D 8[M:::r   c                     t          j        g dt          j                              } t          j        g dt          j                              }t          j        t           j                            g d|           t           j                            ddg|           t           j                            ddg|          g          g}t           j                            |d	g
          S )N)foobazquuxtype)rE   rF   rG   new)   r   N   rK   r      
some_dictsr<   )r>   r?   utf8chunked_arrayDictionaryArrayrA   r@   )dict_valuesnew_dict_valuesrB   s      r   simple_dicts_tablerT   w   s    (111		BBBKh<<<2799MMMO
**<<<EE**Aq6;??**Aq6?CC
 	 	D 8\N;;;r   c                      t           j                            t          j        g d          t          j        g d          gddg          S )N)rE   barrF   quxrK   rL   rM      abr<   )r>   r@   rA   r?   r"   r   r   multiple_column_tabler\      sQ    8*F*F*F!G!G!#,,,!7!7!9'*Cj   2 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 criteriaNc                 ~     t                      j        |fi | t          t          t          d| _        || _        d S )N)   ints   dicts   multi)super__init__rC   rT   r\   table_factoriesoptions)selflocationrf   kwargs	__class__s       r   rd   zConstantFlightServer.__init__   sI    ,,V,,, '(+ 
  

 r   c              #      K   || j         k    rIt          j        t          j        g           t          j                            d          g           V  d S d S )N/foo)CRITERIAr
   
FlightInfor>   schemaFlightDescriptorfor_pathrg   contextcriterias      r   list_flightsz!ConstantFlightServer.list_flights   sf      t}$$#	"'0088       %$r   c                 l     | j         |j                             }t          j        || j                  S )Nrf   )re   ticketr
   RecordBatchStreamrf   )rg   rs   rx   tables       r   do_getzConstantFlightServer.do_get   s3     4$V]355't|DDDDr   NN)	__name__
__module____qualname____doc__rm   rd   ru   r{   __classcell__rj   s   @r   r^   r^      ss          (H       E E E E E E Er   r^   c                   F     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.Nc                 H     t                      j        di | || _        d S Nr"   rc   rd   rf   rg   rf   ri   rj   s      r   rd   zMetadataFlightServer.__init__   +    ""6"""r   c                     t          j        g d          g}t           j                            |dg          }t	          j        |j        |                     |          | j                  S )Nr7   rZ   r<   rw   )	r>   r?   r@   rA   r
   GeneratorStreamro   number_batchesrf   )rg   rs   rx   rB   rz   s        r   r{   zMetadataFlightServer.do_get   sp    H((())
 $$T#$77%L&&L" " " 	"r   c           	         d}g d}|j         j        dk    sJ |D ]\  }}|                    t          j                            t          j        ||         g          gdg                    sJ |J t          j        d|	                                          \  }	||	k    sJ |
                    t          j        d|                     |dz  }|j         j        dk    sJ |j         j        dk    sJ d S )Nr   r7   rK   rZ   <i   r9   )statsnum_messagesequalsr>   RecordBatchrA   r?   structunpack
to_pybyteswritepacknum_record_batches)
rg   rs   
descriptorreaderwritercounterexpected_databatchbufclient_counters
             r   do_putzMetadataFlightServer.do_put   s    +++|(A----  		 		JE3<< : :=12334! !      ???$mD#..2B2BCCONn,,,,LLT733444qLGG|(A----|.!333333r   c              #      K   t          |                                           D ] \  }}t          j        d|          }||fV  !d S )Nr   )	enumerate
to_batchesr   r   )rz   idxr   r   s       r   r   z#MetadataFlightServer.number_batches   s[      #E$4$4$6$677 	 	JC+dC((C*	 	r   N)
r}   r~   r   r   rd   r{   r   staticmethodr   r   r   s   @r   r   r      s|        >>     " " "4 4 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.Nc                 X     t                      j        |fi | d | _        || _        d S r   )rc   rd   last_messageexpected_schema)rg   rh   r   ri   rj   s       r   rd   zEchoFlightServer.__init__   s8    ,,V,,, .r   c                 4    t          j        | j                  S r   )r
   ry   r   rg   rs   rx   s      r   r{   zEchoFlightServer.do_get   s    '(9:::r   c                 j    | j         r| j         |j        k    sJ |                                | _        d S r   )r   ro   read_allr   rg   rs   r   r   r   s        r   r   zEchoFlightServer.do_put   s;     	9'6=8888"OO--r   c                     |D ]}d S r   r"   )rg   rs   r   r   r   chunks         r   do_exchangezEchoFlightServer.do_exchange   s     	 	E	 	r   r|   )	r}   r~   r   r   rd   r{   r   r   r   r   s   @r   r   r      sp        >>/ / / / / /
; ; ;. . .
      r   r   c                   $    e Zd ZdZd Zd Zd ZdS )EchoStreamFlightServerz6An echo server that streams individual record batches.c                 r    t          j        | j        j        | j                            d                    S )N   max_chunksize)r
   r   r   ro   r   r   s      r   r{   zEchoStreamFlightServer.do_get   s7    %$((t(<<> > 	>r   c                     g S r   r"   rg   rs   s     r   list_actionsz#EchoStreamFlightServer.list_actions       	r   c                     |j         dk    r;|                                |                                                    d          gS t          Nwho-am-iutf-8rI   peer_identitypeerencodeNotImplementedErrorrg   rs   actions      r   	do_actionz EchoStreamFlightServer.do_action   B    ;*$$))++W\\^^-B-B7-K-KLL!!r   Nr}   r~   r   r   r{   r   r   r"   r   r   r   r      sG        @@> > >
  " " " " "r   r   c                   $    e Zd ZdZd Zd Zd ZdS )EchoTableStreamFlightServerz,An echo server that streams the whole table.c                 L    t          j        | j        j        | j        g          S r   )r
   r   r   ro   r   s      r   r{   z"EchoTableStreamFlightServer.do_get   s)    %$! ! 	!r   c                     g S r   r"   r   s     r   r   z(EchoTableStreamFlightServer.list_actions  r   r   c                     |j         dk    r;|                                |                                                    d          gS t          r   r   r   s      r   r   z%EchoTableStreamFlightServer.do_action  r   r   Nr   r"   r   r   r   r      sG        66! ! !
  " " " " "r   r   c                   $    e Zd ZdZd Zd Zd ZdS )'EchoRecordBatchReaderStreamFlightServerzCAn echo server that streams the whole table as a RecordBatchReader.c                 p    t          j        | j        j        | j                                        g          S r   )r
   r   r   ro   	to_readerr   s      r   r{   z.EchoRecordBatchReaderStreamFlightServer.do_get  s5    %$((**+- - 	-r   c                     g S r   r"   r   s     r   r   z4EchoRecordBatchReaderStreamFlightServer.list_actions  r   r   c                     |j         dk    r;|                                |                                                    d          gS t          r   r   r   s      r   r   z1EchoRecordBatchReaderStreamFlightServer.do_action  r   r   Nr   r"   r   r   r   r     sG        MM- - -
  " " " " "r   r   c                       e Zd ZdZd Zd ZdS )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                            dd          gt          j        d          	                    t          j
        d                    d          gd	d
dd          S )NrZ   r   grpc://test	localhost  2023-04-05T12:34:56.789012345nszendpoint app metadatarK   *   Tzinfo app metadata)r
   rn   r>   ro   int32FlightEndpointLocationfor_grpc_tcpscalarcast	timestamprg   rs   r   s      r   get_flight_infoz#GetInfoFlightServer.get_flight_info   s     IRXZZ()**%cM?;;%_11+tDDEI=>>CCBLQUDVDVWW+	  
 
 	
r   c                 `    |                      ||          }t          j        |j                  S r   )r   r
   SchemaResultro   )rg   rs   r   infos       r   
get_schemazGetInfoFlightServer.get_schema3  s*    ##GZ88"4;///r   N)r}   r~   r   r   r   r   r"   r   r   r   r     s8        33
 
 
&0 0 0 0 0r   r   c                   .    e Zd ZdZed             Zd ZdS )ListActionsFlightServer'A Flight server that tests ListActions.c                 2    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8
 	
r   c              #   >   K   |                                  E d {V  d S r   )r   r   s     r   r   z$ListActionsFlightServer.list_actionsC  s0      ((***********r   N)r}   r~   r   r   classmethodr   r   r"   r   r   r   r   8  sB        11
 
 [
+ + + + +r   r   c                       e Zd ZdZd ZdS )ListActionsErrorFlightServerr   c              #      K   dV  dV  d S )N)r   r   rE   r"   r   s     r   r   z)ListActionsErrorFlightServer.list_actionsJ  s      r   N)r}   r~   r   r   r   r"   r   r   r   r   G  s)        1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.Nc                 J     t                      j        |fi | || _        d S r   )rc   rd   expected_ticket)rg   r  rh   ri   rj   s       r   rd   z CheckTicketFlightServer.__init__R  s0    ,,V,,,.r   c                     | j         |j        k    sJ t          j        g dt          j                              g}t          j                            |dg          }t          j        |          S )Nr7   rH   rZ   r<   )	r  rx   r>   r?   r   r@   rA   r
   ry   )rg   rs   rx   data1rz   s        r   r{   zCheckTicketFlightServer.do_getV  si    #v}4444---BHJJ???@$$U3%$88'...r   c                 8    |                                 | _        d S r   )r   r   )rg   rs   r   r   s       r   r   zCheckTicketFlightServer.do_put\  s    "OO--r   r   )r}   r~   r   r   rd   r{   r   r   r   s   @r   r   r   O  sa        NN/ / / / / // / /. . . . . . .r   r   c                   X    e Zd ZdZ ej        d ej                    fg          Zd ZdS )InvalidStreamFlightServerzEA Flight server that tries to return messages with differing schemas.rZ   c                    t          j        g dt          j                              g}t          j        g dt          j                              g}|j        |j        k    sJ t           j                            |dg          }t           j                            |dg          }|j        | j        k    sJ t          j	        | j        ||g          S )Nr7   rH   )g      $g      g              @g      $@rZ   r<   )
r>   r?   r   float64rI   r@   rA   ro   r
   r   )rg   rs   rx   r  data2table1table2s          r   r{   z InvalidStreamFlightServer.do_gete  s    ---BHJJ???@777bjllKKKLzUZ''''%%eC5%99%%eC5%99}++++%dkFF3CDDDr   Nr}   r~   r   r   r>   ro   r   r{   r"   r   r   r  r  `  sO        OORYhbhjj)*++FE E E E Er   r  c                   X    e Zd ZdZ ej        d ej                    fg          Zd ZdS )NeverSendsDataFlightServerz0A Flight server that never actually yields data.rZ   c                    |j         dk    r| j                                        | j                                        t          j                            t          d          g| j                  g}t          j        | j        |          S t          j        | j        t          j
        | j                                                            S )N
   yield_datar9   ro   )rx   ro   empty_tabler>   r   rA   ranger
   r   	itertoolsrepeat)rg   rs   rx   rB   s       r   r{   z!NeverSendsDataFlightServer.do_getu  s    =M)) ''))''))**E!HH:dk*JJD
 )$+t<<<%K)$+*A*A*C*CDDF F 	Fr   Nr  r"   r   r   r  r  p  sO        ::RYhbhjj)*++FF F F F Fr   r  c                   4    e Zd ZdZd Zd Zed             ZdS )SlowFlightServerz;A Flight server that delays its responses to test timeouts.c                     t          j        t          j        dt          j                    fg          |                                           S )NrZ   )r
   r   r>   ro   r   slow_streamr   s      r   r{   zSlowFlightServer.do_get  s@    %bi#rxzz1B0C&D&D&*&6&6&8&8: : 	:r   c                 .    t          j        d           g S N      ?)timesleepr   s      r   r   zSlowFlightServer.do_action  s    
3	r   c               #     K   t          j        g dt          j                              g} t           j                            | dg          V  t          j        d           t           j                            | dg          V  d S )Nr7   rH   rZ   r<   r:   )r>   r?   r   r@   rA   r  r   )r  s    r   r  zSlowFlightServer.slow_stream  s      ---BHJJ???@h""5"66666 	
2h""5"6666666r   N)r}   r~   r   r   r{   r   r   r  r"   r   r   r  r    sS        EE: : :   7 7 \7 7 7r   r  c                   :    e Zd ZdZed             Zd Zd Zd ZdS )ErrorFlightServerz9A Flight server that uses all the Flight-specific errors.c            	          t           j        t           j        t           j        t           j        t           j        t          t          j        t          dS )N)internaltimedoutcancelunauthenticatedunauthorizednotimplementedinvalidr1   )
r
   FlightInternalErrorFlightTimedOutErrorFlightCancelledErrorFlightUnauthenticatedErrorFlightUnauthorizedErrorr   r>   ArrowInvalidKeyErrorr"   r   r   error_caseszErrorFlightServer.error_cases  s<     221%@":1	
 	
 		
r   c                     t                                           }|j        |v r ||j                 d          |j        dk    rd}t          j        d|          t
          )NrE   protobuf   this is an error message)r#  r3  rI   r
   r0  r   )rg   rs   r   r3  err_msgs        r   r   zErrorFlightServer.do_action  sb    '3355;+%%*+fk*5111[J&&1G0@@@!!r   c              #      K   t          j        t          j        g           t           j                            d          g           V  t          j        d          )Nrl   rE   )r
   rn   r>   ro   rp   rq   r,  rr   s      r   ru   zErrorFlightServer.list_flights  sZ      IbMM#,,V44
 
 	
 	
 	

 (///r   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|          d S )	Ns   internalrE   s   timedouts   cancels   unauthenticateds   unauthorizeds   protobufr6  )commandr
   r,  r-  r.  r/  r0  )rg   rs   r   r   r   r7  s         r   r   zErrorFlightServer.do_put  s    ,,,U333;..,U3339,,-e444#5553E:::?220777;..1G0@@@ /.r   N)	r}   r~   r   r   r   r3  r   ru   r   r"   r   r   r#  r#    se        CC

 

 \

" " "0 0 0A A A A 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.Nc                 H     t                      j        di | || _        d S r   r   r   s      r   rd   zExchangeFlightServer.__init__  r   r   c                    |j         j        dk    sJ |j        t          j        j        k    rt          j        d          |j        dk    r| 	                    |||          S |j        dk    r| 
                    |||          S |j        dk    r|                     |||          S |j        dk    r|                     |||          S t          j        d|j                   )Nr   z!Must provide a command descriptor   echo   get   put	   transformzUnknown command: )r   r   descriptor_typer
   DescriptorTypeCMDr>   r1  r:  exchange_echoexchange_do_getexchange_do_putexchange_transformr   s        r   r   z ExchangeFlightServer.do_exchange  s    |(A----%)>)BBB/"EFFF7**%%gvv>>>6))''@@@6))''@@@<//**7FFCCC/8J$688: : :r   c                     t           j                            t          j        t	          dd                    gdg          }|                    |j                   |                    |           dS )Emulate DoGet with DoExchange.r    (  rZ   r<   N)r>   r@   rA   r?   r  beginro   write_table)rg   rs   r   r   rB   s        r   rG  z$ExchangeFlightServer.exchange_do_get  so    x##HU1i(())%
 $   	T[!!!4     r   c                    d}|D ]4}|j         st          j        d          |j        j        dk    sJ |dz  }5|j        j        |k    sJ |                    t          |                              d                     dS )Emulate DoPut with DoExchange.r   zAll chunks must have data.rK   r   N)	rB   r>   r1  r   r   r   write_metadatastrr   )rg   rs   r   r   num_batchesr   s         r   rH  z$ExchangeFlightServer.exchange_do_put  s     	 	E: Do&BCCC<,11111KK|.+====c+..55g>>?????r   c                    |j         j        dk    sJ d}|D ]}|s/|j        r(|                    |j        j        | j                   d}|j        r(|j        r!|                    |j        |j                   b|j        r|                    |j                   |j        r-|j         j        dk    sJ |	                    |j                   J d            dS )zRun a simple echo server.r   Frw   TzShould not happenN)
r   r   rB   rM  ro   rf   app_metadatawrite_with_metadatarQ  write_batch)rg   rs   r   r   startedr   s         r   rF  z"ExchangeFlightServer.exchange_echo  s   |(A---- 	2 	2E uz UZ.EEE! 2ej 2**5:u7IJJJJ# 2%%e&89999 2|0A5555""5:....1111u	2 	2r   c                 p   |j         j        dk    sJ |j        D ]J}t          j                            |j                  s$t          j        dt          |          z             K|	                                }|j         j        dk    sJ dg|j
        z  }|D ]9}t          |          D ]'\  }}	||xx         |	                                z  cc<   (:t          j                            t          j        |          gdg          }
|                    |
j                   |                    |
           dS )zSum rows in an uploaded table.r   zInvalid field: sumr<   N)r   r   ro   r>   types
is_integerrI   r1  reprr   num_rowsr   as_pyr@   rA   r?   rM  rN  )rg   rs   r   r   fieldrz   sumscolumnrowvalueresults              r   rI  z'ExchangeFlightServer.exchange_transform  s?   |(A----] 	G 	GE8&&uz22 Go&7$u++&EFFFG!!|(A----sU^# 	+ 	+F'// + +
US			U[[]]*				+%%rx~~&6ug%FFV]###6"""""r   r   )r}   r~   r   r   rd   r   rG  rH  rF  rI  r   r   s   @r   r<  r<    s        **     : : : ! ! !	@ 	@ 	@2 2 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                 V    t                                                       || _        d S r   rc   rd   credsrg   rk  rj   s     r   rd   z#HttpBasicServerAuthHandler.__init__  $    


r   c                 \   |                                 }t          j                            |          }|j        | j        vrt          j        d          | j        |j                 |j        k    rt          j        d          |                    t          |j                             d S )Nunknown userzwrong password)
r'   r
   	BasicAuthdeserializeusernamerk  r/  passwordr   r   )rg   outgoingincomingr   auths        r   authenticatez'HttpBasicServerAuthHandler.authenticate  s    mmoo++C00=
**3NCCC:dm$5534DEEEwt}--.....r   c                 l    |st          j        d          || j        vrt          j        d          |S )Nztoken not providedro  )r
   r/  rk  rg   tokens     r   is_validz#HttpBasicServerAuthHandler.is_valid&  s@     	J34HIII
""3NCCCr   r}   r~   r   r   rd   rw  r{  r   r   s   @r   rg  rg    s\        AA    / / /      r   rg  c                   .     e Zd ZdZ fdZd Zd Z xZS )HttpBasicClientAuthHandlerrh  c                     t                                                       t          j        ||          | _        d | _        d S r   )rc   rd   r
   rp  
basic_authrz  rg   rr  rs  rj   s      r   rd   z#HttpBasicClientAuthHandler.__init__1  s8     *8X>>


r   c                     | j                                         }|                    |           |                                | _        d S r   )r  	serializer   r'   rz  )rg   rt  ru  rv  s       r   rw  z'HttpBasicClientAuthHandler.authenticate6  s:    ((**t]]__


r   c                     | j         S r   rz  rg   s    r   	get_tokenz$HttpBasicClientAuthHandler.get_token;  
    zr   r}   r~   r   r   rd   rw  r  r   r   s   @r   r~  r~  .  s\        AA    
% % %
      r   r~  c                   .     e Zd ZdZ fdZd Zd Z xZS )TokenServerAuthHandler:An example implementation of authentication via handshake.c                 V    t                                                       || _        d S r   rj  rl  s     r   rd   zTokenServerAuthHandler.__init__B  rm  r   c                    |                                 }|                                 }|| j        v r=| j        |         |k    r,|                    t          j        d|z                        d S t          j        d          )N   secret:zinvalid username/password)r'   rk  r   base64	b64encoder
   r/  )rg   rt  ru  rr  rs  s        r   rw  z#TokenServerAuthHandler.authenticateF  sz    ==??==??tz!!dj&:h&F&FNN6+J,ABBCCCCC3+- - -r   c                     t          j        |          }|                    d          st          j        d          |dd          S )Nr  zinvalid token   )r  	b64decode
startswithr
   r/  ry  s     r   r{  zTokenServerAuthHandler.is_validO  sH     ''
++ 	E3ODDDQRRyr   r|  r   s   @r   r  r  ?  s\        DD    - - -      r   r  c                   .     e Zd ZdZ fdZd Zd Z xZS )TokenClientAuthHandlerr  c                 r    t                                                       || _        || _        d| _        d S )Nr   )rc   rd   rr  rs  rz  r  s      r   rd   zTokenClientAuthHandler.__init__Y  s2      


r   c                     |                     | j                   |                     | j                   |                                | _        d S r   )r   rr  rs  r'   rz  rg   rt  ru  s      r   rw  z#TokenClientAuthHandler.authenticate_  s=    t}%%%t}%%%]]__


r   c                     | j         S r   r  r  s    r   r  z TokenClientAuthHandler.get_tokend  r  r   r  r   s   @r   r  r  V  s\        DD    % % %
      r   r  c                       e Zd ZdZd Zd ZdS )NoopAuthHandlerzA no-op auth handler.c                     dS )zDo nothing.Nr"   r  s      r   rw  zNoopAuthHandler.authenticatek  s      r   c                     dS )zV
        Returning an empty string.
        Returning None causes Type error.
        r   r"   ry  s     r   r{  zNoopAuthHandler.is_validn  s	    
 rr   N)r}   r~   r   r   rw  r{  r"   r   r   r  r  h  s8              r   r  c                     | D ]C}|                                 |                                 k    r|                     |          c S DdS )zcLookup the value of given key in the given headers.
       The key lookup is case-insensitive.
    N)lowerr   )headers
lookup_keyr1   s      r   case_insensitive_header_lookupr  v  sY      $ $99;;***,,,,;;s##### -$ $r   c                   $    e Zd ZdZd Zd Zd ZdS )!ClientHeaderAuthMiddlewareFactoryz@ClientMiddlewareFactory that creates ClientAuthHeaderMiddleware.c                     g | _         d S r   call_credentialr  s    r   rd   z*ClientHeaderAuthMiddlewareFactory.__init__  s    !r   c                      t          |           S r   )ClientHeaderAuthMiddlewarerg   r   s     r   
start_callz,ClientHeaderAuthMiddlewareFactory.start_call  s    )$///r   c                     || _         d S r   r  )rg   r  s     r   set_call_credentialz5ClientHeaderAuthMiddlewareFactory.set_call_credential  s    .r   N)r}   r~   r   r   rd   r  r  r"   r   r   r  r    sG        JJ" " "0 0 0/ / / / /r   r  c                       e Zd ZdZd Zd ZdS )r  a  
    ClientMiddleware that extracts the authorization header
    from the server.

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

    Parameters
    ----------
    factory : ClientHeaderAuthMiddlewareFactory
        This factory is used to set call credentials if an
        authorization header is found in the headers from the server.
    c                     || _         d S r   factoryrg   r  s     r   rd   z#ClientHeaderAuthMiddleware.__init__      r   c                     t          |d          }|r7| j                            d|d                             d          g           d S d S )NAuthorization   authorizationr   r   )r  r  r  r   )rg   r  auth_headers      r   received_headersz+ClientHeaderAuthMiddleware.received_headers  sd    4WoNN 	1L,, A%%g...0 1 1 1 1 1	1 	1r   N)r}   r~   r   r   rd   r  r"   r   r   r  r    s<           1 1 1 1 1r   r  c                       e Zd ZdZd ZdS )!HeaderAuthServerMiddlewareFactoryz)Validates incoming username and password.c                    t          |d          }|d                             d          }d}d}|d         dk    rqt          j        |d                   }|                    d                              d	          }|d         d
k    r|d         dk    st          j        |          d}nC|d         dk    r#|d         }|dk    st          j        |          nt          j        |          t          |          S )Nr  r    r   zInvalid credentialsBasicrK   r   :testrs  	token1234Bearer)r  splitr  r  decoder
   r/  HeaderAuthServerMiddleware)	rg   r   r  r  valuesrz  error_messagedecodedpairs	            r   r  z,HeaderAuthServerMiddlewareFactory.start_call  s   4
 
 Q%%c**-!9&vay11G>>'**0055DGv%%$q'Z*?*?7FFFEEAY(""1IEK''7FFF ( 3MBBB)%000r   Nr}   r~   r   r   r  r"   r   r   r  r    s)        331 1 1 1 1r   r  c                       e Zd ZdZd Zd ZdS )r  zBA ServerMiddleware that transports incoming username and password.c                     || _         d S r   r  ry  s     r   rd   z#HeaderAuthServerMiddleware.__init__  s    


r   c                     dd| j         z   iS )NauthorizationzBearer r  r  s    r   sending_headersz*HeaderAuthServerMiddleware.sending_headers  s    TZ!788r   Nr}   r~   r   r   rd   r  r"   r   r   r  r    s8        LL  9 9 9 9 9r   r  c                       e Zd ZdZd ZdS )HeaderAuthFlightServerz<A Flight server that tests with basic token authentication. c                     |                     d          }|rSt          |                                d          }|                    d          }|d                             d          gS t          j        d          )Nrv  r  r  rK   r   zNo token auth middleware found.)get_middlewarer  r  r  r   r
   r/  )rg   rs   r   
middlewarer  r  s         r   r   z HeaderAuthFlightServer.do_action  s    ++F33
 	/8**,,o? ?K &&s++F1I$$W--../-/ / 	/r   Nr}   r~   r   r   r   r"   r   r   r  r    s)        FF/ / / / /r   r  c                       e Zd ZdZd ZdS )'ArbitraryHeadersServerMiddlewareFactoryz<A ServerMiddlewareFactory that transports arbitrary headers.c                      t          |          S r   ) ArbitraryHeadersServerMiddlewarerg   r   r  s      r   r  z2ArbitraryHeadersServerMiddlewareFactory.start_call  s    /888r   Nr  r"   r   r   r  r    s)        FF9 9 9 9 9r   r  c                       e Zd ZdZd Zd ZdS )r  z5A ServerMiddleware that transports arbitrary headers.c                     || _         d S r   ru  )rg   ru  s     r   rd   z)ArbitraryHeadersServerMiddleware.__init__  s     r   c                     | j         S r   r  r  s    r   r  z0ArbitraryHeadersServerMiddleware.sending_headers  
    }r   Nr  r"   r   r   r  r    s8        ??! ! !    r   r  c                       e Zd ZdZd ZdS )ArbitraryHeadersFlightServerz6A Flight server that tests multiple arbitrary headers.c                 4   |                     d          }|rn|                                }t          |d          }t          |d          }|d                             d          }|d                             d          }||gS t	          j        d          )Narbitrary-headersztest-header-1ztest-header-2r   r   zNo headers middleware found)r  r  r  r   r
   FlightServerError)	rg   rs   r   r  r  header_1header_2value1value2s	            r   r   z&ArbitraryHeadersFlightServer.do_action  s    ++,?@@
 	$ 0022G5 H 6 H a[''00Fa[''00FF##&'DEEEr   Nr  r"   r   r   r  r    s.        @@F F F F Fr   r  c                       e Zd ZdZd ZdS )HeaderServerMiddlewarez/Expose a per-call value to the RPC method body.c                     || _         d S r   )special_value)rg   r  s     r   rd   zHeaderServerMiddleware.__init__  s    *r   N)r}   r~   r   r   rd   r"   r   r   r  r    s)        99+ + + + +r   r  c                       e Zd ZdZd ZdS )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44r   Nr  r"   r   r   r  r    s)        DD5 5 5 5 5r   r  c                       e Zd ZdZd ZdS )HeaderFlightServerz(Echo back the per-call hard-coded value.c                 j    |                     d          }|r|j                                        gS dgS )Nr  r   )r  r  r   )rg   rs   r   r  s       r   r   zHeaderFlightServer.do_action  s<    ++F33
 	7,335566ur   Nr  r"   r   r   r  r    s)        22    r   r  c                       e Zd ZdZd ZdS )MultiHeaderFlightServer8Test sending/receiving multiple (binary-valued) headers.c                     |                     d          }t          |j                                      d          }|gS )Nr  r   )r  r]  client_headersr   )rg   rs   r   r  r  s        r   r   z!MultiHeaderFlightServer.do_action  s;    ++F33
z01188AAyr   Nr  r"   r   r   r  r    s)        BB    r   r  c                       e Zd ZdZd ZdS )$SelectiveAuthServerMiddlewareFactoryz1Deny access to certain methods based on a header.c                     |j         t          j        j        k    rd S |                    d          }|st          j        d          |d         }|dk    rt          j        d          t          |          S )Nx-auth-tokenzNo tokenr   rs  zInvalid token)methodr
   FlightMethodLIST_ACTIONSr   r/  r  )rg   r   r  rz  s       r   r  z/SelectiveAuthServerMiddlewareFactory.start_call%  sx    ;&-:::FN++ 	@3J???aJ3ODDD%e,,,r   Nr  r"   r   r   r  r  "  s)        ;;- - - - -r   r  c                       e Zd Zd ZdS )$SelectiveAuthClientMiddlewareFactoryc                     t                      S r   )SelectiveAuthClientMiddlewarer  s     r   r  z/SelectiveAuthClientMiddlewareFactory.start_call6  s    ,...r   N)r}   r~   r   r  r"   r   r   r  r  5  s#        / / / / /r   r  c                       e Zd Zd ZdS )r  c                 
    ddiS )Nr  rs  r"   r  s    r   r  z-SelectiveAuthClientMiddleware.sending_headers;  s    J
 	
r   N)r}   r~   r   r  r"   r   r   r  r  :  s#        
 
 
 
 
r   r  c                   (     e Zd ZdZ fdZd Z xZS ) RecordingServerMiddlewareFactory Record what methods were called.c                 V    t                                                       g | _        d S r   rc   rd   methodsrg   rj   s    r   rd   z)RecordingServerMiddlewareFactory.__init__D  $    r   c                 D    | j                             |j                   d S r   r  appendr  r  s      r   r  z+RecordingServerMiddlewareFactory.start_callH      DK(((tr   r}   r~   r   r   rd   r  r   r   s   @r   r  r  A  M        **          r   r  c                   (     e Zd ZdZ fdZd Z xZS ) RecordingClientMiddlewareFactoryr	  c                 V    t                                                       g | _        d S r   r  r  s    r   rd   z)RecordingClientMiddlewareFactory.__init__P  r  r   c                 D    | j                             |j                   d S r   r  r  s     r   r  z+RecordingClientMiddlewareFactory.start_callT  r  r   r  r   s   @r   r  r  M  r  r   r  c                       e Zd ZdZd Zd ZdS )"MultiHeaderClientMiddlewareFactoryr  c                     i | _         d S r   )last_headersr  s    r   rd   z+MultiHeaderClientMiddlewareFactory.__init__\  s     r   c                      t          |           S r   )MultiHeaderClientMiddlewarer  s     r   r  z-MultiHeaderClientMiddlewareFactory.start_calla  s    *4000r   N)r}   r~   r   r   rd   r  r"   r   r   r  r  Y  s8        BB  
1 1 1 1 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dS )r  r  rE   rV          rF   )zx-textzx-binary-binzx-MIXED-cases   x-other-MIXED-casec                     || _         d S r   r  r  s     r   rd   z$MultiHeaderClientMiddleware.__init__p  r  r   c                     | j         S r   )EXPECTEDr  s    r   r  z+MultiHeaderClientMiddleware.sending_headerss  r  r   c                 D    | j         j                            |           d S r   )r  r  update)rg   r  s     r   r  z,MultiHeaderClientMiddleware.received_headersv  s#     	!((11111r   N)r}   r~   r   r   r$  rd   r  r  r"   r   r   r  r  e  sn        BB %. '* %w H    2 2 2 2 2r   r  c                       e Zd ZdZd ZdS )"MultiHeaderServerMiddlewareFactoryr  c                      t          |          S r   )MultiHeaderServerMiddlewarer  s      r   r  z-MultiHeaderServerMiddlewareFactory.start_call  s    *7333r   Nr  r"   r   r   r(  r(  |  s)        BB4 4 4 4 4r   r(  c                       e Zd ZdZd Zd ZdS )r*  r  c                     || _         d S r   )r  )rg   r  s     r   rd   z$MultiHeaderServerMiddleware.__init__  s    ,r   c                     t           j        S r   )r  r$  r  s    r   r  z+MultiHeaderServerMiddleware.sending_headers  s    *33r   Nr  r"   r   r   r*  r*    s8        BB- - -4 4 4 4 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                 N     t                      j        |i | ddz  | _        d S )N           )rc   rd   	_metadata)rg   argsri   rj   s      r   rd   z"LargeMetadataFlightServer.__init__  s/    $)&)))-r   c                     t          j        dt          j                    fg          }t          j        |t          j        dgg|          | j        fg          S )NrZ   rK   r  )r>   ro   int64r
   r   record_batchr3  )rg   rs   rx   ro   s       r   r{   z LargeMetadataFlightServer.do_get  sX    S"(**-.//%f_qcU6222DNC/
   	r   c                 :    |                     | j                   d S r   )rQ  r3  r   s        r   r   z%LargeMetadataFlightServer.do_exchange  s    dn-----r   )r}   r~   r   r   rd   r{   r   r   r   s   @r   r/  r/    s\        **. . . . .  . . . . . . .r   r/  c                  	   d} d}d}d}d}d}d}d}d	}d
}	t          t          j        dd                    | k    sJ t          t          j        dd                    |k    sJ t          t          j        dd                    |k    sJ t          t          j                            d                    |k    sJ t          j        dg t          j	        d          
                    t          j        d                    d          }
t          |
          |k    sJ t          j        t          j        g           t          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                                        g dddd          }d}t          |          |k    sJ |j        J t'          j        t*                    5  t          j        dd            d d d            n# 1 swxY w Y   t'          j        t*                    5  t          j        t-                      g            d d d            n# 1 swxY w Y   t'          j        t*                    5  t          j        dddt-                      g           d d d            n# 1 swxY w Y   t'          j        t*                    5  t          j        dg d           d d d            n# 1 swxY w Y   t'          j        t*                    5  t          j        dg t/          d d!d"dd#d$                     d d d            n# 1 swxY w Y   t'          j        t*                    5  t          j        dg t-                      %           d d d            d S # 1 swxY w Y   d S )&Nz1<pyarrow.flight.Action type='foo' body=(0 bytes)>z)ActionType(type='foo', description='bar')z?<pyarrow.flight.BasicAuth username=b'user' password=(redacted)>z,<pyarrow.flight.FlightDescriptor cmd=b'foo'>z<pyarrow.flight.FlightEndpoint ticket=<pyarrow.flight.Ticket ticket=b'foo'> locations=[] expiration_time=2023-04-05 12:34:56+00:00 app_metadata=b'endpoint app metadata'>z<pyarrow.flight.FlightInfo schema= descriptor=<pyarrow.flight.FlightDescriptor path=[]> endpoints=[] total_records=1 total_bytes=42 ordered=True app_metadata=b'test app metadata'>z6<pyarrow.flight.Location b'grpc+tcp://localhost:1234'>z&<pyarrow.flight.Result body=(3 bytes)>z'<pyarrow.flight.SchemaResult schema=()>z%<pyarrow.flight.Ticket ticket=b'foo'>rE   r   rV   userpass   foo2023-04-05T12:34:56s   endpoint app metadatarK   r   T   test app metadatagrpc+tcp://localhost:1234)intr6  z1<pyarrow.flight.SchemaResult schema=(int: int64)>z<pyarrow.flight.FlightInfo schema=None descriptor=<pyarrow.flight.FlightDescriptor path=[]> endpoints=[] total_records=1 total_bytes=42 ordered=True app_metadata=b'test app metadata'>r   s   grpc://testz2023-04-05T01:02:03)expiration_timei  rY   r9   rL   rM   rU  )r]  r
   Actionr   rp  rp   for_commandr   r>   r   r   r   rn   ro   rq   r   Resultr   Ticketpytestraises	TypeErrorobjectr   )action_repraction_type_reprbasic_auth_reprdescriptor_reprendpoint_repr	info_reprlocation_reprresult_reprschema_result_reprticket_reprendpointr   s               r   	test_reprrX    s5   EKBWODO>M	-  MM:KB9KeS))**k9999!%//004DDDDD 0011_DDDD'33E::;;NNNN$BI34499",s:K:KLL  H >>]****
	"v.77992	2t) D ::"""" ;<<==NNNNf%%&&+5555#BIbMM22337IIIII#BI/?.@$A$ABBCC;< < < <f%%&&+5555;")B--''''f%..00"	2t) D
	-  ::"""";	y	!	! # #eT"""# # # # # # # # # # # # # # # 
y	!	! , ,fhh+++, , , , , , , , , , , , , , ,	y	!	! P Pem^VXX%NOOOP P P P P P P P P P P P P P P	y	!	! P PeR9NOOOOP P P P P P P P P P P P P P P	y	!	! X XeR$1aQRTU9V9VWWWWX X X X X X X X X X X X X X X	y	!	! @ @eRfhh????@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @sl   5LLL;"M))M-0M-%N>>OO"PP
P
**Q  Q$'Q$$R55R9<R9c                     d d d d d d d d d	 d
 d d d d d d d d d d d g} | D ]T} |            \  }} |            \  }}||k    sJ ||k    sJ ||k    sJ ||k    sJ ||k    sJ ||k    sJ ||k    sJ Ud S )Nc                  V    t          j        dd          t          j        dd          fS )NrE   r   rV   r
   rE  r"   r   r   <lambda>ztest_eq.<locals>.<lambda>  s#    uc**FM%,E,EF r   c                  V    t          j        dd          t          j        dd          fS )NrE   r      barr[  r"   r   r   r\  ztest_eq.<locals>.<lambda>  s#    uc**FM%,H,HI r   c                  V    t          j        dd          t          j        dd          fS )NrE   rV   rF   r   r"   r   r   r\  ztest_eq.<locals>.<lambda>  s(    "5%00"5%002 r   c                  V    t          j        dd          t          j        dd          fS )Nr:  r;  user2r
   rp  r"   r   r   r\  ztest_eq.<locals>.<lambda>  s(    !&&11!'6224 r   c                  V    t          j        dd          t          j        dd          fS )Nr:  r;  pass2rb  r"   r   r   r\  ztest_eq.<locals>.<lambda>  s(    !&&11!&'224 r   c                  ~    t           j                            d          t           j                            d          fS )NrE   )r
   rp   rF  rq   r"   r   r   r\  ztest_eq.<locals>.<lambda>  s0    (44U;;(11%88: r   c                  V    t          j        dg           t          j        dg           fS Nr<  r^  r
   r   r"   r   r   r\  ztest_eq.<locals>.<lambda>  s(    &vr22&vr224 r   c                      t          j        dt          j        d          g          t          j        dt          j        d          g          fS )Nr<  rA  grpc+tls://localhost:1234)r
   r   r   r"   r   r   r\  ztest_eq.<locals>.<lambda>  sS    !)DEEFH H!)DEEFH H
 r   c            
      6   t          j        dg t          j        d                              t          j        d                              t          j        dg t          j        d                              t          j        d                              fS )Nr<  r=  r>  z2023-04-05T12:34:56.789ms)r
   r   r>   r   r   r   r"   r   r   r\  ztest_eq.<locals>.<lambda>  s    !BI&;<<AA",sBSBSTTV V!	34499",t:L:LMMO OP r   c                  ^    t          j        dg d          t          j        dg d          fS )Nr<  r   rD     metarh  r"   r   r   r\  ztest_eq.<locals>.<lambda>  s3    &vrDDD&vrHHHJ r   c                  :   t          j        t          j        g           t           j                                        g           t          j        t          j        dt          j                    fg          t           j                                        g           fS Nints)r
   rn   r>   ro   rp   rq   r6  r"   r   r   r\  ztest_eq.<locals>.<lambda>  sy    	"'0022B8 8 	FBHJJ/011'0022B8 8	9 r   c                     t          j        t          j        g           t           j                                        g           t          j        t          j        g           t           j                            d          g           fS Nr<  )r
   rn   r>   ro   rp   rq   rF  r"   r   r   r\  ztest_eq.<locals>.<lambda>  sn    	"'0022B8 8 	"'33F;;RA A	B r   c            	      b   t          j        t          j        g           t           j                                        t          j        dg           g          t          j        t          j        g           t           j                                        t          j        dg           g          fS rg  )r
   rn   r>   ro   rp   rq   r   r"   r   r   r\  ztest_eq.<locals>.<lambda>  s    	"'0022&vr2235 5 	"'0022&vr2235 56 r   c                     t          j        t          j        g           t           j                                        g d          t          j        t          j        g           t           j                                        g d          fS )N)total_recordsrK   r
   rn   r>   ro   rp   rq   r"   r   r   r\  ztest_eq.<locals>.<lambda>  s~    	"'0022BbJ J J 	"'0022BaI I I	J r   c                     t          j        t          j        g           t           j                                        g d          t          j        t          j        g           t           j                                        g d          fS )Nrv  )total_bytesr   rx  r"   r   r   r\  ztest_eq.<locals>.<lambda>%  s~    	"'0022BBH H H 	"'0022BBH H H	I r   c                     t          j        t          j        g           t           j                                        g d          t          j        t          j        g           t           j                                        g d          fS )NF)orderedTrx  r"   r   r   r\  ztest_eq.<locals>.<lambda>,  s~    	"'0022BG G G 	"'0022BF F F	G r   c                     t          j        t          j        g           t           j                                        g d          t          j        t          j        g           t           j                                        g d          fS )Nr   rD  rn  rx  r"   r   r   r\  ztest_eq.<locals>.<lambda>3  s~    	"'0022BSJ J J 	"'0022BWN N N	O r   c                  R    t          j        d          t          j        d          fS )NrA  rj  )r
   r   r"   r   r   r\  ztest_eq.<locals>.<lambda>:  s$    !<==!<==? r   c                  R    t          j        d          t          j        d          fS rg  )r
   rG  r"   r   r   r\  ztest_eq.<locals>.<lambda><  s    v&&f(=(=> r   c                      t          j        t          j        g                     t          j        t          j        dt          j                    fg                    fS rp  )r
   r   r>   ro   r6  r"   r   r   r\  ztest_eq.<locals>.<lambda>=  sE    $RYr]]33$RY0D/E%F%FGGI r   c                  R    t          j        d          t          j        d          fS )Nr   r<  )r
   rH  r"   r   r   r\  ztest_eq.<locals>.<lambda>?  s    s##V]6%:%:; r   r"   )itemsgenlhs1rhs1lhs2rhs2s         r   test_eqr    st   FFII	2 	2	4 	4	4 	4	: 	:	4 	4	
 	
	P 	P	J 	J	9 	9	B 	B	6 	6	J 	J	I 	I	G 	G	O 	O	? 	?>>	I 	I;;gTEl  	 	SUU
dSUU
dt||||t||||t||||t||||t||||t||||t|||||	 	r   c                  F   t          j        t          j        g           t           j                                        g           } t          j        t          j        g           t           j                                        g dd          }t          j        t          j        g           t           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 d S )Nrv  )rw  rz  )r
   rn   r>   ro   rp   rq   rw  rz  )fi1fi2fi3s      r   test_flight_info_defaultsr  N  s'   

BIbMM6+B+K+K+M+Mr
R
RC


	"((**BbbR R RC 

	"((**BdPTV V VC """"""""""""?b    ?b    ?b      r   c                      d ddt                      fg} | D ]A}t          |          5 }t          |t                    sJ 	 d d d            n# 1 swxY w Y   Bd S )Ngrpc://localhost:0r   )r   r   
isinstance)	locationsrh   servers      r   $test_flight_server_location_argumentr  `  s    	n&&'I
  8 8h'' 	86f&6777777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	88 8s   AA	A	c                      t          j        t                    5  t                      5  t                      # 1 swxY w Y   	 d d d            d S # 1 swxY w Y   d S r   )rI  rJ  
ValueErrorr   r"   r   r   #test_server_exit_reraises_exceptionr  k  s    	z	"	"   	 	,,	 	 	 	 	 	 	 	 	                 s(   A8<	A<	 AAAc                  j   dt                      fd } fd}t                    5 }t          j        |d          }|                                 t          j                    }|                    d           t          j                    |z
  }|dk    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr   c                      t          j        d           t                     at                                           d S r  )r  r   r   r  serverh   s   r   r  z-test_client_wait_for_available.<locals>.servew  s.    
3!(++r   Ttargetdaemonr9   timeoutr  )r   r   	threadingThreadstartr  wait_for_available)r  r  clientthreadrX  elapsedrh   s         @r   test_client_wait_for_availabler  q  s    ^--.HF     
h		 6!t<<<)++!!!!,,,)++'#~~~~~                 s   A2B((B,/B,c                     t                      5 } t          j        d| j        f          5 }t	          |                                          g k    sJ |                    t           j                  }t          t	          |                    dk    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zTry a simple list_flights call.r   rK   N)r^   r
   connectportlistru   rm   len)r  r  flightss      r   test_flight_list_flightsr    s7   			 '6NK566':@F''))**b0000%%&:&CDD4==!!Q&&&&&	' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 's5   B9A)B!B9!B%	%B9(B%	)B99B= B=c                     t                      5 } t          j        d| j        f          5 }t	          |                                          g k    sJ |                                 |                                 t          j        t          j
                  5  t	          |                                           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   )r^   r
   r  r  r  ru   closerI  rJ  r>   r1  r  r  s     r   test_flight_client_closer    s   			 (6NK566(:@F''))**b0000]2?++ 	( 	($$&&'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (sY   C6A.C"C;CCCCCC6C"	"C6%C"	&C66C:=C:c                     t                      } t                      5 }t          j        d|j        f          5 }|                    t          j        d                                                    }|                    |           sJ 	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t          j
                            t          j
        j        j                  }t          |          5 }t          j        d|j        f          5 }|                    t          j        d                                                    }|                    |           sJ |                    t          j        d                                                                                    }|                    |           sJ 	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t          j        t          j        d          5  t          d          5 }t          j        d|j        f          5 }|                    t          j        d                                                    }ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )	Try a simple do_get call.r   r`   Nmetadata_versionrw   z+expected IpcWriteOptions, got <class 'int'>matchr   )rC   r^   r
   r  r  r{   rH  r   r   r>   ipcIpcWriteOptionsMetadataVersionV4r   rI  rJ  r  )rz   r  r  rB   rf   s        r   test_flight_do_get_intsr    sL   E			 "6NK566":@}}V]73344==??{{5!!!!!!" " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
 f$$/2 % 4 4G	g	.	.	. "&NK566":@}}V]73344==??{{5!!!!! }}V]73344>>@@IIKK{{5!!!!!!" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 
v/J
L 
L 
L D D!"--- 	DV[9::	D>D==w!7!788AACCD	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	DD D D D D D D D D D D D D D D D D Ds   B.ABB.B	B.B	B..B25B2=G0B3GG0G	G0 G	!G00G47G4J=,J%:JJ%JJ%JJ%J=%J)	)J=,J)	-J==KKc                     t                      } t                      5 }t          j        d|j        f          5 }|                    t          j        d                                                    }t          |d                   | 	                    d          
                                k    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )r  r   r`   r;   r   N)rC   r^   r
   r  r  r{   rH  read_pandasr  rb  	to_pylist)rz   r  r  rB   s       r   test_do_get_ints_pandasr    sg    E			 F6NK566F:@}}V]73344@@BBD%&&%,,q//*C*C*E*EEEEEEF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F Fs5   CA:C 4C C	CC	CCCc            
         t                      } t                      5 }t          j        d|j        f          5 }|                    t          j        d                    }|j        j        dk    sJ |	                                }|
                    |           sJ |j        t          ddddd          k    sJ 	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )	Nr   ra   rK   r   rM   rL   r   r   r   num_dictionary_batchesnum_dictionary_deltasnum_replaced_dictionaries)rT   r^   r
   r  r  r{   rH  r   r   r   r   r   )rz   r  r  r   rB   s        r   test_flight_do_get_dictsr    sz     E			 
6NK566
:@v}X6677|(A----  {{5!!!!!|y #$"#&' 
  
  
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s5   C"BC
>C"
C	C"C	C""C&)C&c                     t          j        g dt          j                              g} t           j                            | dg          }t          d          5 }t          j        d|j        f          5 }|	                    t          j
        d                                                    }|                    |          sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )	z+Make sure Tickets get passed to the server.r7   rH   rZ   r<   s
   the-ticket)r  r   N)r>   r?   r   r@   rA   r   r
   r  r  r{   rH  r   r   )r  rz   r  r  rB   s        r   test_flight_do_get_ticketr    s`   X)))

;;;<EH  se 44E	 	?	?	? "6NK566":@}}V]=99::CCEE{{5!!!!!!" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "s7   C/9ACC/C	C/C	C//C36C3c                  *   t                      5 } t          d| j        f          }|                    t          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                              t          j        dd                    k    sJ |j        d         j
        dk    sJ |j        d         j        d         t          j                            dd          k    sJ 	 d	d	d	           d	S # 1 swxY w Y   d	S )z8Make sure FlightEndpoint accepts string and object URIs.r   r   rK   r   s   info app metadatarZ   rL   r   Nr   z#2023-04-05T12:34:56.789012345+00:00r   UTCr?  r   )r   r   r  r   r
   rp   rF  rw  rz  r|  rU  ro   r>   r   r  	endpointsr  rC  r   r   r   r   r   r  r  r   s      r   test_flight_get_infor    s[   			 <&{FK899%%f&=&I&I#&N&NOO!Q&&&&2%%%%|| $88888{bi#rxzz):(;<<<<<<4>""a''''4>!$.//14444~a 0888~a -4444~a *1-1O1OOOOO~a 0I;<<tBLu--../ / / / ~a -1IIIII~a *1-O((d;;< < < < <#< < < < < < < < < < < < < < < < < <s   G+HHHc                  |   t                      5 } t          d| j        f          5 }|                    t          j                            d                    }|j        t          j        dt          j	                    fg          k    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z+Make sure GetSchema returns correct schema.r   r   rZ   N)
r   r   r  r   r
   rp   rF  ro   r>   r   r  s      r   test_flight_get_schemar    s)   			 =&+v{344=8>  !8!D!DS!I!IJJ{bi#rxzz):(;<<<<<<<= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =s5   B1A&BB1B	B1 B	!B11B58B5c                     t                      5 } t          d| j        f          5 }t          j        t
          j        d          5  t          |                                           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t                      5 } t          d| j        f          5 }t          |                                          t          
                                k    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z6Make sure the return type of ListActions is validated.r   z3Results of list_actions must be ActionType or tupler  N)r   r   r  rI  rJ  r
   r  r  r   r   r   r  s     r   test_list_actionsr    ss    
&	'	' (6+v{344(8>](-
 
 
 	( 	(
 $$&&'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 
!	"	" 7f+v{34478>F''))**#44667 7 7 7 77 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7s   B#!B"A5)B5A99B<A9=B B#B	B#B	B##B'*B'<D7?DD7D#	#D7&D#	'D77D;>D;c                   .    e Zd ZdZed             Zd ZdS )ConvenienceServerzT
    Server for testing various implementation conveniences (auto-boxing, etc.)
    c                 
    g dS )N)r<  r^  s   bazr"   r  s    r   simple_action_resultsz'ConvenienceServer.simple_action_results  s    ''''r   c                     |j         dk    r| j        S |j         dk    r|j        gS |j         dk    rdgS |j         dk    rt          j                    |j         dk    rfd} |            S d S )Nsimple-actionecho
bad-actionrE   arrow-exceptionforeverc               3   h   K                                     sdV                                    d S d S rs  )is_cancelled)rs   s   r   r  z(ConvenienceServer.do_action.<locals>.gen   sN      !..00 ! LLL "..00 ! ! ! ! !r   )rI   r  bodyr>   ArrowMemoryError)rg   rs   r   r  s    `  r   r   zConvenienceServer.do_action  s    ;/))--[F""K= [L((7N[---%'''[I%%! ! ! ! ! 355L	 &%r   N)r}   r~   r   r   propertyr  r   r"   r   r   r  r    sH          ( ( X(    r   r  c                  b   t                      5 } t          d| j        f          5 }d |                    d          D             }|| j        k    sJ d}d |                    d|f          D             }||gk    sJ 	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   c                     g | ]	}|j         
S r"   r  .0xs     r   
<listcomp>z5test_do_action_result_convenience.<locals>.<listcomp>+  s    EEEa16EEEr   r  s   the-bodyc                     g | ]	}|j         
S r"   r  r  s     r   r  z5test_do_action_result_convenience.<locals>.<listcomp>0  s    DDDa16DDDr   r  )r  r   r  r   r  )r  r  resultsr  s       r   !test_do_action_result_conveniencer  &  sQ   			 
!+v{344
!8> FE6#3#3O#D#DEEE&66666 DD6#3#3VTN#C#CDDD4&     
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
!s5   B$AB B$B	B$B	B$$B(+B(c                     t                      5 } t          d| j        f          5 }t          j        t
          j        d          5  t          |                    d                     d d d            n# 1 swxY w Y   t          j        t
          j        d          5  t          |                    d                     d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   za bytes-like object is requiredr  r  r  r  )	r  r   r  rI  rJ  r
   r  r  r   r  s     r   test_nicer_server_exceptionsr  4  s   			 6+v{34468>]63!BD D D 	1 	1!!,//000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 ]63!35 5 5 	6 	6!!"344555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	66 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6s|   C?!C'#A6*C'6A::C'=A:>#C'!#CC'CC'CC'C?'C+	+C?.C+	/C??DDc                      t          d          } 	 | j        dk    sJ 	 |                                  dS # |                                  w xY w)zMake sure port() works.r  r   N)r   r  shutdown)r  s    r   test_get_portr  C  sR     !566F{Qs	   5 Antz'Unix sockets can't be tested on Windows)reasonc                  r   t          j                    5 } |                                  t          j                            | j                  }t          |          5  t          |          5 }|	                    t          j
        d                    }t                      }|j                            |j                  sJ |                                }|                    |          sJ |	                    t          j
        d                    }t                      }|j                            |j                  sJ |                                }|                    |          sJ 	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z3Try a simple do_get call over a Unix domain socket.r  r`   ra   N)tempfileNamedTemporaryFiler  r
   r   for_grpc_unixnamer^   r   r{   rH  rC   ro   r   r   rT   )sockrh   r  r   rz   rB   s         r   test_flight_domain_socketr  L  s8    
	$	&	& &$

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

    See ARROW-4421: by default, gRPC won't allow us to send messages >
    4MiB in size.
    r   i   rZ   r<   )r   r   r  r   N)r>   r@   rA   r?   r  r   ro   r   r  r   r
   rp   rq   rN  r  r{   rH  r   r   rB   r  r  r   _re  s         r   test_flight_large_messager  c  s    8
q*++,,!U    D 
$+	6	6	6 #&+v{344#8>MM&"9"B"B6"J"J"&+/ /	 	4!1222v}S1122;;==}}T""""""# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #s7   E0B6D3'E3D7	7E:D7	;EEEc                     t           j                            t          j        t	          dd                    gdg          } t                      5 }t          d|j        f          5 }|                    t          j
                            d          | j                  \  }}|                    |            |                                 |                    t          j        d                                                    }|                    |           sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )	z?Try downloading a flight of RecordBatches in a GeneratorStream.r   rL  rZ   r<   r   r  r   N)r>   r@   rA   r?   r  r   r   r  r   r
   rp   rq   ro   rN  r  r{   rH  r   r   r  s         r   'test_flight_generator_stream_of_batchesr  y  s   8
q)$$%%!U    D 
 	!	! #V+v{344#8>MM&"9"B"B6"J"J"&+/ /	4   v}S1122;;==}}T""""""# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #7   E)B5D+E+D/	/E2D/	3EE
Ec            
          t           j                            t          j        g dt          j        t          j                    t          j                                        t          j        g d          gddg          } t                      5 }t          d|j	        f          5 }|
                    t          j                            d          | j                  \  }}|                    |            |                                 |                    t          j        d                                                    }|                    |           sJ 	 d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
z_
    Try downloading a flight of RecordBatches with dictionaries
    in a GeneratorStream.
    rE   rV   rF   rE   rE   {      iY  i  i7  rZ   r[   r<   r   r  r   Nr>   r@   rA   r?   
dictionaryr6  rO   r   r   r  r   r
   rp   rq   ro   rN  r  r{   rH  r   r   r  s         r   1test_flight_generator_stream_of_batches_with_dictr       
 8
444rxzz279955	7 	7
***++! 3Z	    D 
1	2	2 #f+v{344#8>MM&"9"B"B6"J"J"&+/ /	4   v}S1122;;==}}T""""""# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #7   F)B5E+F+E/	/F2E/	3FF
Fc                     t           j                            t          j        t	          dd                    gdg          } t                      5 }t          d|j        f          5 }|                    t          j
                            d          | j                  \  }}|                    |            |                                 |                    t          j        d                                                    }|                    |           sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )	z7Try downloading a flight of Table in a GeneratorStream.r   rL  rZ   r<   r   r  r   N)r>   r@   rA   r?   r  r   r   r  r   r
   rp   rq   ro   rN  r  r{   rH  r   r   r  s         r   %test_flight_generator_stream_of_tabler    s   8
q)$$%%!U    D 
%	&	& #&+v{344#8>MM&"9"B"B6"J"J"&+/ /	4   v}S1122;;==}}T""""""# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #r   c            
          t           j                            t          j        g dt          j        t          j                    t          j                                        t          j        g d          gddg          } t                      5 }t          d|j	        f          5 }|
                    t          j                            d          | j                  \  }}|                    |            |                                 |                    t          j        d                                                    }|                    |           sJ 	 d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
zW
    Try downloading a flight of Table with dictionaries
    in a GeneratorStream.
    r  r  rZ   r[   r<   r   r  r   Nr  r  s         r   /test_flight_generator_stream_of_table_with_dictr    r	  r
  c                     t           j                            t          j        t	          dd                    gdg          } t                      5 }t          d|j        f          5 }|                    t          j
                            d          | j                  \  }}|                    |            |                                 |                    t          j        d                                                    }|                    |           sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )	zCTry downloading a flight of RecordBatchReader in a GeneratorStream.r   rL  rZ   r<   r   r  r   N)r>   r@   rA   r?   r  r   r   r  r   r
   rp   rq   ro   rN  r  r{   rH  r   r   r  s         r   3test_flight_generator_stream_of_record_batch_readerr    s   8
q)$$%%!U    D 
1	2	2 #f+v{344#8>MM&"9"B"B6"J"J"&+/ /	4   v}S1122;;==}}T""""""# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #r   c            
          t           j                            t          j        g dt          j        t          j                    t          j                                        t          j        g d          gddg          } t                      5 }t          d|j	        f          5 }|
                    t          j                            d          | j                  \  }}|                    |            |                                 |                    t          j        d                                                    }|                    |           sJ 	 d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
zc
    Try downloading a flight of RecordBatchReader with dictionaries
    in a GeneratorStream.
    r  r  rZ   r[   r<   r   r  r   Nr  r  s         r   =test_flight_generator_stream_of_record_batch_reader_with_dictr    r	  r
  c                     t                      5 } t          d| j        f          5 }t          j        t
          j                  5  |                    t          j	        d                    
                                 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z+Try streaming data with mismatched schemas.r   r   N)r  r   r  rI  rJ  r>   ArrowExceptionr{   r
   rH  r   r  s     r   $test_flight_invalid_generator_streamr    sg   	"	$	$ 9+v{34498>]2,-- 	9 	9MM&-,,--66888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	99 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9sX   B:B":B?B"BB"BB"B:"B&	&B:)B&	*B::B>B>c            	         t                      5 } t          d| j        f          5 }t          j        dd          }t          j        d          }t          j        t          j                  5  t          |
                    ||                     ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z)Make sure timeouts fire on slow requests.r   r   r   g?r  rw   N)r  r   r  r
   rE  r   rI  rJ  r-  r  r   )r  r  r   rf   s       r   test_timeout_firesr    s    
		 <v+v{344<8>r3''*3777 ]6566 	< 	<!!&'!::;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<< < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < <sY   CA	B7/%B B7 B$$B7'B$(B7+C7B;	;C>B;	?CCCc                  P   t                      5 } t          d| j        f          5 }t          j        d          }|                    t          j        d          |                                           ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z0Make sure timeouts do not fire on fast requests.r   r	  r  r`   rw   N)r^   r   r  r
   r   r{   rH  r   )r  r  rf   s      r   test_timeout_passesr    s9   			 J6+v{344J8>*3777fmG,,g>>GGIIIJ J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J Js5   BAB7BB	B
B	BB"Bc                     t           j                            t          j        g d          gdg          } t	                      5 }t          d|j        f          5 }t          j        t          dg                    }|
                    t          j        d          |	                                          }|
                    t          j        d                                                    }|j        d
k    sJ |j        dk    sJ || k    sJ |t                      k    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z"Make sure ReadOptions can be used.rX   r[   r<   r   rK   )included_fields)read_optionsrb   rw   rL   N)r>   r@   rA   r?   r^   r   r  r
   r   r   r{   rH  r   num_columnsr\   )expectedr  r  rf   	response1	response2s         r   test_read_optionsr!    s   x##RXlll%;%;$<SE#JJH			 46+v{34448>*'<<<> > >MM&-# #& " ( ((0

 	MM&-"9"9::CCEE	$))))$))))H$$$$133333334 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4s7   ECD9-E9D=	=E D=	EEE   tests   p4ssw0rd)rk  c                     t          t                    5 } t          d| j        f          5 }t	          j        dd          }t          j        t          j        d          5  t          |
                    |                     ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z,Test that auth fails when not authenticated.auth_handlerr   r   r   z.*unauthenticated.*r  N)r   basic_auth_handlerr   r  r
   rE  rI  rJ  r/  r  r   r  r  r   s      r   test_http_basic_unauthr(     s    
 -?	@	@	@ +F+v{344+8>z3//]6<!68 8 8 	+ 	+!!&))***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sX   C6B)##BB)BB)BB)C)B-	-C0B-	1CCCz,ARROW-10013: gRPC on Windows corrupts peer()c                     t          t                    5 } t          d| j        f          5 }t	          j        dd          }|                    t          dd                     |                    |          }t          |          }|j
                                        dk    sJ t          |          }|j
                                        dk    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )	z:Test a Python implementation of HTTP basic authentication.r$  r   r   r   r  p4ssw0rdr"  N)r   r&  r   r  r
   rE  rw  r~  r   nextr  r   )r  r  r   r  identitypeer_addresss         r   test_http_basic_authr.  +  sz    
 -?	@	@	@ 5F+v{34458>z3//6vzJJKKK""6**==}''))W4444G}} ++--444445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5s5   C<B*C$C<$C(	(C<+C(	,C<<D D c            	         t          t                    5 } t          d| j        f          5 }t	          j        dd          }t          j        t          j        d          5  |	                    t          dd                     t          |                    |                     d	d	d	           n# 1 swxY w Y   d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
z-Test that auth fails with the wrong password.r$  r   r   r   z.*wrong password.*r  r  wrongN)r   r&  r   r  r
   rE  rI  rJ  r/  rw  r~  r+  r   r'  s      r   %test_http_basic_auth_invalid_passwordr1  :  s   	-?	@	@	@ +F+v{344+8>z3//]6<!57 7 7 	+ 	+ :67 K KLLL!!&))***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sY   C$6C#AB5)C5B99C<B9=C C$C	C$C	C$$C(+C(c                     t          t                    5 } t          d| j        f          5 }t	          j        dd          }|                    t          dd                     t          |	                    |                    }|j
                                        dk    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )	-Test an auth mechanism that uses a handshake.r$  r   r   r   r  r*  r"  N)r   token_auth_handlerr   r  r
   rE  rw  r  r+  r   r  r   )r  r  r   r,  s       r   test_token_authr5  E  sJ   	-?	@	@	@ 5F+v{34458>z3//26:FFGGG((0011}''))W444445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5s5   CA:B4(C4B8	8C;B8	<CCCc            	      p   t          t                    5 } t          d| j        f          5 }t	          j        t          j                  5  |                    t          dd                     ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )r3  r$  r   r  r0  N)
r   r4  r   r  rI  rJ  r
   r/  rw  r  r  s     r   test_token_auth_invalidr7  O  s   	-?	@	@	@ IF+v{344I8>]6<== 	I 	I 6vw G GHHH	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	II I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I IsX   B+B$A<0B<B  BB BB+B	B+B	B++B/2B/c                  B   t          t          dt                      i          5 } t          d| j        f          5 }|                    dd          }|d         dk    sJ |d         d	k    sJ 	 d
d
d
           n# 1 swxY w Y   d
d
d
           d
S # 1 swxY w Y   d
S )zATest authenticate_basic_token with bearer token and auth headers.rv  r%  r  r   r"     passwordr   r  rK      Bearer token1234N)r  no_op_auth_handlerr  r   r  authenticate_basic_token)r  r  
token_pairs      r   test_authenticate_basic_tokenr?  [  s<   	-?133M 
 
 
 4
+v{3444 9?44WkJJ
!} 00000!} 3333334 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4s4   B3A<0B<B 	 BB 	BBBc                  t   t          t          dt                      i          5 } t          d| j        f          5 }t          j        t          j                  5  |	                    dd           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z7Test authenticate_basic_token with an invalid password.rv  r9  r   r"  s   badpasswordN)
r  r<  r  r   r  rI  rJ  r
   r/  r=  r  s     r   .test_authenticate_basic_token_invalid_passwordrA  f  s   	-?133M 
 
 
 E
+v{344E 9?]6<== 	E 	E++G^DDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E	E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E EsX   B-BA>2B>BBBB	B-B	B-B	B--B14B1c            
      &   t          t          dt                      i          5 } t          d| j        f          5 }|                    dd          }|d         dk    sJ |d         d	k    sJ t          j        |g
          }t          |	                    t          j
        dd          |                    }|d         j                                        dk    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z@Test authenticate_basic_token and doAction after authentication.rv  r9  r   r"  r:  r   r  rK   r;  r  test-actionr   r   rf   	   token1234N)r  r<  r  r   r  r=  r
   r   r  r   rE  r  r   r  r  r>  rf   re  s        r   (test_authenticate_basic_token_and_actionrH  p  s   	-?133M 
 
 
 
;
+v{344
; 9?44WkJJ
!} 00000!} 33333*J<@@@f&&=44g ' G G H Hay~((**l:::::
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
;s5   DB%C."D.C2	2D5C2	6DD
D
c            	      \   t          t          dt                      i          5 } t                      }t	          d| j        f|g          }t          j        d          }t          j	        dd|z   fg          }t          |                    t          j        d	d
          |                    }|d         j                                        dk    sJ |j        d         dk    sJ |j        d         dk    sJ t          |                    t          j        d	d
          |                    }|d         j                                        dk    sJ |j        d         dk    sJ |j        d         dk    sJ |                                 ddd           dS # 1 swxY w Y   dS )zTest authenticate_basic_token with client middleware
       to intercept authorization header returned by the
       HTTP header auth enabled server.
    rv  r9  r   r  s   test:passwordr  s   Basic rC  rD  r   rE  r   rF  rK   r;  N)r  r<  r  r  r   r  r  r  r
   r   r  r   rE  r  r   r  r  )r  client_auth_middlewarer  encoded_credentialsrf   re  result2s          r   4test_authenticate_basic_token_with_client_middlewarerN    sA   
 
 -?133M 
 
 
 
!B!D!D&+&./
 
 
 %./?@@*y+>>?4
    f&&=44g ' G G H Hay~((**l::::%5a8<LLLLL%5a8%& & & &v''=44g ( G G H Hqz))++|;;;;%5a8<LLLLL%5a8%& & & &1                 s   E/F!!F%(F%c            
         t          t          t                      t                      d          5 } t	          d| j        f          5 }|                    dd          }|d         dk    sJ |d         d	k    sJ t          j        |d
dg          }t          |
                    t          j        dd          |                    }|d         j                                        dk    sJ |d         j                                        dk    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z:Test passing multiple arbitrary headers to the middleware.)rv  r  r9  r   r"  r:  r   r  rK   r;  )s   test-header-1   value1)s   test-header-2   value2rC  rD  r   rw   rP  rQ  N)r  r<  r  r  r   r  r=  r
   r   r  r   rE  r  r   rG  s        r   -test_arbitrary_headers_in_flight_call_optionsrR    s   	%'577!H!J!J
 

 
 
 8
 +v{3448 9?44WkJJ
!} 00000!} 33333*))4
   
 f&&v}3(  ( )0 ' 2 2 3 3ay~((**i7777ay~((**i77777%8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s6   D:	CD"D:"D&	&D:)D&	*D::D>D>c                  .   t          j        t          j        d          5  t	          j        d           ddd           n# 1 swxY w Y   t          j        t          j        d          5  t          d           ddd           dS # 1 swxY w Y   dS )zTest constructing invalid URIs.z.*Cannot parse URI:.*r  %N)rI  rJ  r>   r1  r
   r  r^   r"   r   r   test_location_invalidrU    s   	r.E	F	F	F  s               
r.E	F	F	F " "S!!!" " " " " " " " " " " " " " " " " "s#   AA	A-B

BBc                      t          j        d          j        dk    sJ t          j        d          j        dk    sJ dS )z,Test creating locations for unknown schemes.zs3://foos   s3://foozhttps://example.com/bar.parquets   https://example.com/bar.parquetN)r
   r   urir"   r   r   test_location_unknown_schemerX    sR    ?:&&*k9999?<==A*+ + + + + +r   c                     t                      } t          | d                   5 }t          dt          |j                  z             5 }t          j        t          j                  5  |	                    t          j
        d                                                     ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z>Make sure clients cannot connect when cert verification fails.r3   tls_certificateszgrpc+tls://localhost:r`   N)r5   r^   r   rR  r  rI  rJ  r
   FlightUnavailableErrorr{   rH  r   certsr>  r  s      r   test_tls_failsr_    s    E 
u^/D	E	E	E =03qv;;>??=CI ]6899 	= 	=MM&-0011::<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=	= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =sY   %C
C):B/#C/B33C6B37C:CC
	
CC
	CC"%C"c                     t                      } t                      }t          |d                   5 }t          d|j        f|d                   5 }|                    t          j        d                                                    }|	                    |           sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z"Try a simple do_get call over TLS.r3   rZ  r   r2   )tls_root_certsr`   N)
rC   r5   r^   r   r  r{   r
   rH  r   r   rz   r^  r>  r  rB   s        r   test_tls_do_getrc    sL    EE	u^/D	E	E	E "k16*$)+$6	8 	8 	8";A}}V]73344==??{{5!!!!!!	" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "s6   CAB0$C0B4	4C7B4	8CCCc                     t                      } t                      }t          |d                   5 }	 t          d|j        fd          }n$# t
          $ r t          j        d           Y nw xY w|                    t          j
        d                                                    }|                    |           sJ |                                 ddd           dS # 1 swxY w Y   dS )	zDTry a simple do_get call over TLS with server verification disabled.r3   rZ  r   Tdisable_server_verificationz4disable_server_verification feature is not availabler`   N)rC   r5   r^   r   r  r   rI  skipr{   r
   rH  r   r   r  rb  s        r   $test_tls_disable_server_verificationrh    s>    EE	u^/D	E	E	E 	P!;"7>BD D DFF" 	P 	P 	PKNOOOOO	P}}V]73344==??{{5!!!!!                 s5   C#AC#A/,C#.A//A'C##C'*C'c                     t                      } t          | d                   5 }t          j        d|j        f| d         d          5 }t          j        t          j                  5  |                    t          j	        d                     ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )	z5Check that incorrectly overriding the hostname fails.r3   rZ  r   r2   fakehostname)ra  override_hostnamer`   N)
r5   r^   r
   r  r  rI  rJ  r\  r{   rH  r]  s      r   test_tls_override_hostnamerl    s    E	u^/D	E	E	E 2QV,&+K&8)7	9 	9 	92 =C]6899 	2 	2MM&-00111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2	2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2sY   %C
B4)(BB4B!!B4$B!%B4(C4B8	8C;B8	<CCCc                     t          j        g d          g} t           j                            | dg          }g }t	                      5 }t          d|j        f          5 }|                    t          j	        d                    }d}|D ]P\  }}|
                    |           t          j        d|                                          \  }	||	k    sJ |dz  }Qt           j                            |          } |                     |          sJ 	 d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
z'Try a simple do_get call with metadata.r7   rZ   r<   r   r   r   r   rK   N)r>   r?   r@   rA   r   r   r  r{   r
   rH  r  r   r   r   from_batchesr   )
rB   rz   batchesr  r  r   r   r   metadata
server_idxs
             r   test_flight_do_get_metadatarr    s    	$$$%%D H  cU 33EG			 
"6+v{344
"8>v}S1122% 	 	OE8NN5!!! -h.A.A.C.CDDKJ*$$$$1HCCx$$W--{{5!!!!!!
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
"s7   
D9!B3D!D9!D%	%D9(D%	)D99D= D=c                     g } g }t                      5 }t          d|j        f          5 }|                    t	          j        d                    }d}	 	 |                                \  }}|                     |           t          j	        d|
                                          \  }||k    sJ |dz  }n# t          $ r Y nw xY wu	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t                      5 }t          d|j        f          5 }|                    t	          j        d                    }d}|D ]P\  }}|                    |           t          j	        d|
                                          \  }||k    sJ |dz  }Q	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   | |k    sJ dS )z0Verify the iterator interface works as expected.r   r   r   Tr   rK   N)r   r   r  r{   r
   rH  
read_chunkr  r   r   r   StopIteration)	batches1batches2r  r  r   r   r   rp  rq  s	            r   1test_flight_metadata_record_batch_reader_iteratorrx    s   HH			 6+v{3448>v}S1122	"("3"3"5"5x&&&$mD(2E2E2G2GHH
j((((q    	                               
		 6+v{3448>v}S1122% 	 	OE8OOE""" -h.A.A.C.CDDKJ*$$$$1HCC			                              xs   C.+CA"B98C9
CCCCC.C	C.C	C..C25C2F?A=F(F?(F,	,F?/F,	0F??GGc                  0   t           j                            t          j        g d          gdg          } t           j                            t           j        j        j                  }t          |          5 }t          d|j
        f          5 }|                    t          j        d                    }|                                }|                    |           sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )	z2Try a simple do_get call with V4 metadata version.r7   rZ   r<   r  rw   r   r   N)r>   r@   rA   r?   r  r  r  r  r   r   r  r{   r
   rH  r   r   )rz   rf   r  r  r   rB   s         r   test_flight_do_get_metadata_v4rz  6  s   H  	%%%	&	&'u ! 6 6Ef$$/2 % 4 4G	g	.	.	. "&+v{344"8>v}S1122  {{5!!!!!!	" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "s7   <DAC3'D3C7	7D:C7	;DDDc            	         t          j        g d          g} t           j                            | dg          }t	                      5 }t          d|j        f          5 }|                    t          j	        
                    d          |j                  \  }}|5  t          |                    d                    D ]y\  }}t          j        d|          }|                    ||           |                                }	|	J t          j        d|	                                          \  }
||
k    sJ z	 d	d	d	           n# 1 swxY w Y   d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
z'Try a simple do_put call with metadata.r7   rZ   r<   r   r   rK   r   r   N)r>   r?   r@   rA   r   r   r  r   r
   rp   rq   ro   r   r   r   r   rV  r'   r   r   )rB   rz   r  r  r   metadata_readerr   r   rp  r   rq  s              r   test_flight_do_put_metadatar}  C  sC    	$$$%%D H  cU 33E			 )6+v{344)8>"(--#,,R00L# #  	) 	)'(8(8q(8(I(IJJ ) )
U!;tS11**5(;;;%**,,$mD#..2B2BCC
j((((()	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )s[   E7>EBE<EEEEEE7E#	#E7&E#	'E77E;>E;c            	          t           j                            t          j        t	          j        dt	          j                                        gdg          } t                      5 }t          d|j	        fd          5 }|
                    t          j                            d          | j                  \  }}|5  t          j        t          j        d	
          5 }|                    |            ddd           n# 1 swxY w Y   |j        j        dk    sJ |                     dd          |                     d          g}|D ]}|                    |           	 ddd           n# 1 swxY w Y   t           j                            | g          }|                    t          j        d                                                    }	||	k    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z+Try a simple do_put call with a size limit.i   )dtyperZ   r<   r   i   )write_size_limit_bytesr   zexceeded soft limitr  Nr   i  r   )r>   r   rA   r?   nponesr6  r   r   r  r   r
   rp   rq   ro   rI  rJ  FlightWriteSizeExceededErrorrW  rd  limitslicer@   rn  r{   rH  r   )
large_batchr  r  r   r|  excinfosmaller_batchesr   r  actuals
             r   test_flight_do_put_limitr  Y  s    .,,
BHJJ///00.U -  K 
		 "vk6;/,0	2 	2 	2"5;"(--#,,R00#  #   
	* 
	*vB%:< < < 0?F"";///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =&$....!!!S))!!#&&O ) * *""5))))*
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 8((+77v}S1122;;==6!!!!!'" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "s   )H>G+ !E2!D	7E2DE2
DAE2&G+2E66G+9E6:A$G+H+G/	/H2G/	3HH
Hc                     t                      5 } t          d| j        f          5 }|                    t	          j        d                    }|                                 t          j        t          j	        d          5  |
                                 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z4Test canceling a DoGet operation on the client side.r   r`   z(?i).*cancel.*r  N)r^   r   r  r{   r
   rH  r'  rI  rJ  r.  rt  )r  r  r   s      r   test_cancel_do_getr  v  s    
		  6+v{344 8>v}W5566]66!13 3 3 	  	 	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 	                                                                 sY   CAB:B#B:#B''B:*B'+B:.C:B>	>CB>	CCCc                     t                      5 } t          d| j        f          5 }|                    t	          j        d                    t          j                    t          j                    t          j                    t          j                    fd}t          j	        |d          }|
                                                     d                                                                             |                    d           5                                  sJ 	 d	d	d	           n# 1 swxY w Y   d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
z5Test canceling a DoGet operation from another thread.r   r`   c                  :                                                                                          d           	                                   d S # t          j        $ r4 5                                    d d d            Y d S # 1 swxY w Y   Y d S w xY w)Nr9   r  )rt  setwaitr
   r.  )raised_proper_exceptionread_first_messager   result_lockstream_canceleds   r   
block_readz/test_cancel_do_get_threaded.<locals>.block_read  s    ""$$$   +++2!!#####. 2 2 2  2 2+//1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22s6   A B(B=BB	BB	BBTr  r9   r  rK   N)r  r   r  r{   r
   rH  r  EventLockr  r  r  r'  r  joinis_set)	r  r  r  r  r  r  r   r  r  s	       @@@@@r   test_cancel_do_get_threadedr    s@    
		 4v+v{34448>v}W5566&_..#/++n&&"+/"3"3	2 	2 	2 	2 	2 	2 	2 	2 	2 !DAAA***A 	4 	4*11333333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	454 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4sY   E;C=E#(E E#EE#EE#E;#E'	'E;*E'	+E;;E?E?c                  6   t                      5 } t          d| j        f          5 }|                    t	          j        dd                    }t          |          j        dk    sJ ~d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   r  r   r<  )r  r   r  r   r
   rE  r+  r  )r  r  r  s      r   test_streaming_do_actionr    s   			 +v{3448>""6=C#@#@AAG}}!V++++                                s5   BAA6*B6A:	:B=A:	>BBBc                     t          j        dd          } | t           j                            |                                           k    sJ t          j        d          }|t           j                            |                                          k    sJ t          j        d          }|t           j                            |                                          k    sJ t          j        dd          }|t           j                            |                                          k    sJ t          j        t          j	        dt          j
                    fg                    }|t           j                            |                                          k    sJ t           j                            d          }|t           j                            |                                          k    sJ t           j                            dd	d
          }|t           j                            |                                          k    sJ t          j        t          j	        dt          j
                    fg          |t          j        ddg          t          j        dt           j                            dd          gt          j        d                              t          j        d                    d          gdddd          }t           j                            |                                          }|j	        |j	        k    sJ |j        |j        k    sJ |j        |j        k    sJ |j        |j        k    sJ |j        |j        k    sJ |j        |j        k    sJ |j        |j        k    sJ t          j        |dt           j                            dd          gt          j        d                              t          j        d                    d          }|t           j                            |                                          k    sJ dS )z(Make sure serializable types round-trip.action1s   action1-bodyrE   s   result1	username1	password1rZ   r  r[   z
test.arrowr   r   r   r   r   r   r?  rK   r   Tr@  r=  r>  N)r
   rE  rq  r  rH  rG  rp  r   r>   ro   r   rp   rF  rq   rn   r   r   r   r   r   r   r   rz  rw  r|  rU  r  )	r   rx   re  r  schema_resultdescr   info2rW  s	            r   test_roundtrip_typesr    s   ]9o66FV]..v/?/?/A/ABBBBBB]5!!FV]..v/?/?/A/ABBBBBB]:&&FV]..v/?/?/A/ABBBBBB!+{;;J)55j6J6J6L6LMMMMMM'	C3D2E(F(FGGMF/;;!!# # # # # # "..v66D6*66t~~7G7GHHHHHH"++ClCCD6*66t~~7G7GHHHHHH
	C$%&&!#77!--k4@@A	9::??T@R@RS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GH
	'((--bl3.?.?@@ 	 H v,889K9K9M9MNNNNNNNNr   c                     t                      5 } t          d| j        f          5 }t                                                                           D ]h\  }}t          j        |d          5  t          |                    t          j
        |d                               ddd           n# 1 swxY w Y   it          j        t          j        d          5  t          |                                           ddd           n# 1 swxY w Y   t          j        g d          g}t          j                            |dg          }t          j        t          j        t          j        t          j        t          j        d	}|                                D ]\  }}t          j        |d          5  |                    t          j                            |          |j                  \  }	}
|	                    |           |	                                 ddd           n# 1 swxY w Y   t          j        |d          5  |                    t          j                            |          |j                  \  }	}
|	                                 ddd           n# 1 swxY w Y   	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )
z:Ensure that Flight errors propagate from server to client.r   z.*foo.*r  r   Nr7   rZ   r<   )r%  r&  r'  r(  r)  )r#  r   r  r3  r  rI  rJ  r  r   r
   rE  r,  ru   r>   r?   r@   rA   r-  r.  r/  r0  r   rp   rF  ro   rN  r  )r  r  argexc_typerB   rz   
exceptionsr:  	exceptionr   r   s              r   test_roundtrip_errorsr    s"   			 !+v{344!8>.::<<BBDD 	@ 	@MCxy999 @ @V%%fmC&=&=>>???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @]65YGGG 	( 	($$&&'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( ,,,--.$$T#$77 221%@":
 

 #-"2"2"4"4 	 	GYy	:::  !'+77@@L"" "" ""5)))               y	:::  !'+77@@L"" "" 	              	)! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !s   KAJ?-6B/	#J?/B33J?6B37$J?"D	=J?	DJ?DB&J?7A%H(	J?(H,,J?/H,0J?	AJ%	J?%J))J?,J)-J?3K?K	KK	KKKc                  h   t          j        g d          g} t           j                            | dg          }t	                      5 }t          d|j        f          5 }|                    t          j	        
                    d          |j                  \  }dgfd}t          j        |          }|                                 |                    d	
          }|5  t!          |          D ]0\  }}	t#          j        d|          }
|                    |	|
           1|                                 |                                 ddd           n# 1 swxY w Y   d         t-          |          k    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z7Ensure that separate threads can read/write on a DoPut.r7   rZ   r<   r   r   r   c                  |                                     & dxx         dz  cc<                                    $d S d S )Nr   rK   )r'   )countr|  s   r   _reader_threadz:test_do_put_independent_read_write.<locals>._reader_thread   sJ    !&&((4aA "&&((44444r   r  rK   r   r   N)r>   r?   r@   rA   r   r   r  r   r
   rp   rq   ro   r  r  r  r   r   r   r   rV  done_writingr  r  )rB   rz   r  r  r   r  r  ro  r   r   rp  r  r|  s              @@r   "test_do_put_independent_read_writer    s    	$$$%%D H  cU 33E			 (6+v{344(8>"(--#,,R00L# # 	 	 	 	 	 	 !888"""33 	 	'00 < <
U!;tS11**5(;;;;!!!KKMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 Qx3w<<'''''5( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s\   
F'!BF'A)EFE  F#E $FF'F	F'F	F''F+.F+c            
         t          dt                      i          5 } t          d| j        f          5 }t	          |                    t          j        dd                              }t          |          dk    sJ |d         j	        
                                }d|k    sJ 	 d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
z@Ensure that server middleware run on the same thread as the RPC.r  rJ  r   r"  r   rK   r   s   right valueN)r  r  r   r  r  r   r
   rE  r  r  r   )r  r  r  rd  s       r   "test_server_middleware_same_threadr  5  s]   	-//( 
 
 
 '
+v{344' 9?v''gs(C(CDDEE7||q    
**,,&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 's5   CA2B5)C5B9	9C<B9	=CCCc                  H   t          dt                      i          5 } t          d| j        f          5 }t	          j        t          j                  5  t          |	                                           ddd           n# 1 swxY w Y   t	          j        t          j                  5  t          |                    t          j        dd                               ddd           n# 1 swxY w Y   t          d| j        ft                      g          }t          |                    t          j        dd                              }d|j                                        k    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z-Test rejecting an RPC with server middleware.r  rJ  r   Nr   r:  )r  r  r   r  rI  rJ  r>   ArrowNotImplementedErrorr  r   r
   r/  r   rE  r  r+  r  r   )r  r  responses      r   test_middleware_rejectr  A  s   	466( 
 
 
 9
+v{3449 9?]2677 	( 	($$&&'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( ]6<== 	< 	<!!&-S"9"9::;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< &+&<>>?
 
 
 ((sC)@)@AABBhm668888888#9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9s}   FE?"B7E?BE?
B!E?,6C."E?.C22E?5C26A<E?3F?F	FF	FFFc                     t                      } t                      }t          d| i          5 }t          d|j        f|g          5 }t
          j                            d          }t          j	        t                    5  t          |                                           ddd           n# 1 swxY w Y   t          j	        t                    5  |                    |           ddd           n# 1 swxY w Y   t          j	        t                    5  |                    |           ddd           n# 1 swxY w Y   t          j	        t                    5  |                    t          j        d                     ddd           n# 1 swxY w Y   t          j	        t                    5  |                    |t%          j        g                     \  }}|                                 ddd           n# 1 swxY w Y   t          j	        t                    5  t          |                    t          j        dd                               ddd           n# 1 swxY w Y   t          j	        t                    5  t          |                                           ddd           n# 1 swxY w Y   t          j	        t                    5  |                    |          \  }}|                                 ddd           n# 1 swxY w Y   t
          j        j        t
          j        j        t
          j        j        t
          j        j        t
          j        j        t
          j        j        t
          j        j         t
          j        j!        g}| j"        |k    sJ |j"        |k    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z/Test that middleware records methods correctly.r  rJ  r   r   N)#r  r  r   r   r  r
   rp   rF  rI  rJ  r   r  ru   r   r   r{   rH  r   r>   ro   r  r   rE  r   r   r  LIST_FLIGHTSGET_FLIGHT_INFO
GET_SCHEMADO_GETDO_PUT	DO_ACTIONr   DO_EXCHANGEr  )server_middlewareclient_middlewarer  r  r   r   r  r  s           r   test_middleware_mappingr  W  s   8::8::	f.?%@	A	A	A %5V&+&)*	 	 	%5 
,88==
].// 	( 	($$&&'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(].// 	/ 	/"":...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/].// 	* 	*j)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*].// 	. 	.MM&-,,---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.].// 	 	j")B--@@IFALLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ].// 	< 	<!!&-S"9"9::;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<].// 	( 	($$&&'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(].// 	 	**:66IFALLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 ,/*&&),+	
 !(H4444 (H44444K%5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5 %5sW  O%	9O"B0$O0B44O7B48OC6*O6C::O=C:>OD<0O<E  OE O (FOFOFO8A H8OHOHO(6I*O*I..O1I.2O"J<0O<K  OK O -LOLO L!BOO%O	O%O	O%%O),O)c            
         t                      5 } t          d| j        f          5 }	 t          |                    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xY w Y   d d d            d S # 1 swxY w Y   d S )Nr   r5  r   Fr6  )	r#  r   r  r  r   r
   rE  r0  
extra_info)r  r  eeis       r   test_extra_infor    sf   			 5+v{34458>	5!!&-
C"@"@AABBB5- 	5 	5 	5<+++B4444444444	5 55 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5sW   B8B 7AB.BB BB B8 B$	$B8'B$	(B88B<?B<c                     t                      } t                      }t          | d         d         gd| d                   5 }t          d|j        f| d         | d         d         j        | d         d         j                  5 }|                    t          j	        d                    
                                }|                    |          sJ 	 d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
z!Test mutual TLS (mTLS) with gRPC.r3   r   Tr2   )r[  verify_clientroot_certificatesr   )ra  
cert_chainprivate_keyr`   N)r5   rC   r^   r   r  r0   r1   r{   r
   rH  r   r   )r^  rz   r>  r  rB   s        r   	test_mtlsr    s    EE	#N3A67#K0
2 
2 
2 
" 67!&! -^,Q/4n-a04		6 	6 	6	
" :@}}V]73344==??{{5!!!!!!
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
"s8   AC;AC#C;#C'	'C;*C'	+C;;C?C?c                     t           j                            t          j        t	          dd                    gdg          } t                      5 }t          d|j        f          5 }t          j	        
                    d          }|                    |          \  }}|5  |                                }ddd           n# 1 swxY w Y   | |k    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )rK  r   rL  rZ   r<   r   r@  N)r>   r@   rA   r?   r  r<  r   r  r
   rp   rF  r   r   )r  r  r  r   r   r   rz   s          r   test_doexchange_getr    s   x##
q)$$%%%U $  H 
		 !6+v{344!8>,88@@
++J77 	& 	&OO%%E	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&5     ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !sZ   C<):C$#C8C$CC$CC$C<$C(	(C<+C(	,C<<D D c                  l   t           j                            t          j        t	          dd                    gdg          } |                     d          }t                      5 }t          d|j        f          5 }t          j
                            d          }|                    |          \  }}|5  |                    | j                   |D ]}|                    |           |                                 |                                }|j        J t'          t)          |                                        d
          }	|j        |	k    sJ |j        j        dk    sJ 	 d	d	d	           n# 1 swxY w Y   d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )rP  r   rL  rZ   r<      r   r   rA  Nr   )r>   r@   rA   r?   r  r   r<  r   r  r
   rp   rF  r   rM  ro   rW  r  rt  rB   rR  r  r   rU  r   r   )
rB   ro  r  r  r   r   r   r   r   expected_bufs
             r   test_doexchange_putr    sj   8
q)$$%%!U    D ooCo00G			 26+v{34428>,88@@
++J77 
	2 
	2LL%%%  * *""5))))!!!%%''E:%%%s7||,,33G<<L%5555<,11111
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2	2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s[   (F)?:F9B4E:.F:E>>FE>FF)F	F)F	F))F-0F-c                  "   t           j                            t          j        t	          dd                    gdg          } |                     d          }t                      5 }t          d|j        f          5 }t          j
                            d          }|                    |          \  }}|5  t	          d	          D ]c}t          |                              d
          }|                    |           |                                }	|	j        J |	j        |k    sJ d|                    | j                   d}
|D ]j}|                    |           |j        | j        k    sJ |                                }	|	j        |k    sJ |	j        J |
dz  }
|j        j        |
k    sJ kt1          |          D ]\  }}t          |                              d
          }|                    ||           |                                }	|	j        |k    sJ |	j        |k    sJ |
dz  }
|j        j        |
k    sJ 	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zTry a DoExchange echo server.r   rL  rZ   r<   r  r   r   r?  r:   r   NrK   )r>   r@   rA   r?   r  r   r<  r   r  r
   rp   rF  r   rR  r   rQ  rt  rB   rU  rM  ro   rW  r   r   r   rV  )rB   ro  r  r  r   r   r   ir   r   rS  r   s               r   test_doexchange_echor    s   8
q)$$%%!U    D ooCo00G			 !F6+v{344!F8>,88AA
++J77 	F 	F2YY 1 1!ffmmG,,%%c***))++z))))S00000 LL%%%K  F F""5)))}3333))++zU****)111q |6+EEEEE &g.. F F5!ffmmG,,**5#666))++zU****)S0000q |6+EEEEEF-	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F	!F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !F !Fs[   (J?:I,9FI	I,II,II, J,I0	0J3I0	4JJJc                  V   t           j                            t          j        t	          dd                    gdg          } |                     d          }t           j                            t           j        j        j	                  }t          |          5 }t          d	|j        f          5 }t          j                            d
          }|                    |          \  }}|5  |                    | j        |           |D ]S}|                    |           |j        | j        k    sJ |                                }	|	j        |k    sJ |	j        J T	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z;Try a DoExchange echo server using the V4 metadata version.r   rL  rZ   r<   r  r   r  rw   r   r?  N)r>   r@   rA   r?   r  r   r  r  r  r  r<  r   r  r
   rp   rF  r   rM  ro   rW  rt  rB   rU  )
rB   ro  rf   r  r  r   r   r   r   r   s
             r   test_doexchange_echo_v4r    sh   8
q)$$%%!U    D ooCo00Gf$$/2 % 4 4G	g	.	.	. 2&+v{34428>,88AA
++J77 	2 	2LLgL666  2 2""5)))}3333))++zU****)11112	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2	2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s[   F5:F/A3E/#F/E33F6E37F:FF
	
FF
	FF"%F"c            
         t           j                            t          j        t	          dd                    t          j        t	          dd                    t          j        t	          dd                    gg d          } t           j                            t          j        t	          d	d
d	                    gdg          }t                      5 }t          d|j        f          5 }t          j	        
                    d          }|                    |          \  }}|5  |                    | j                   |                    |            |                                 |                                }ddd           n# 1 swxY w Y   ||k    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z!Transform a table with a service.r   r   rK   i  rL   i  )rZ   r[   cr<   rM   i  rZ  r   rB  N)r>   r@   rA   r?   r  r<  r   r  r
   rp   rF  r   rM  ro   rN  r  r   )rB   r  r  r  r   r   r   rz   s           r   test_doexchange_transformr  	  sj   8
q$  
q$  
q$  ! __	    D
 x##
q,**++%W $  H 
		 	!6+v{344	!8>,88FF
++J77 	& 	&LL%%%t$$$!!!OO%%E		& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&
 5     	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s[   G0:F.*AFF.FF.FF."G.F2	2G5F2	6GG
G
c            
         t          dt                      i          5 } t                      }t          d| j        f|g          5 }t          |                    t          j        dd                              }|j	        
                                                    d          }t          j        |          }t          j                                        D ]~\  }}|                                }t%          |t&                    r|                    d          }|                    |          |k    sJ |j                            |          |k    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )r  r  rJ  r   r   r   asciiN)r  r(  r  r   r  r+  r   r
   rE  r  r   r  astliteral_evalr  r$  r  r  r  bytesr   r  )r  r  r  r  raw_headersr  headerr  s           r   test_middleware_multi_headerr  #	  s%   	 244- 
 
 
 B
466fk*#9& & & 	B)/F,,V]3-D-DEEFFH"-2244;;GDDK -k::N"="F"L"L"N"N B Bfe,, 4#]]733F%))&11V;;;;+//776AAAAAB	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B	B B B B B B B B B B B B B B B B B Bs6   (E?DE'E?'E+	+E?.E+	/E??FFc                     t                      } t          | d                   5 }dg}t          j        d|j        f| d         |          }t          j        t          j                  5  |                    t          j	        d                     ddd           n# 1 swxY w Y   |
                                 d	g}t          j        d|j        f| d         |          }t          j        t          j        t          j        f          5  |                    t          j	        d                     ddd           n# 1 swxY w Y   |
                                 ddd           dS # 1 swxY w Y   dS )
z$Test setting generic client options.r3   rZ  )zgrpc.ssl_target_name_overriderj  r   r2   )ra  generic_optionsr`   N)zgrpc.max_receive_message_length    )r5   r^   r
   r  r  rI  rJ  r\  r{   rH  r  r>   r1  r.  )r^  r>  rf   r  s       r   test_generic_optionsr  9	  s    E	u^/D	E	E	E DEaf 5/4[/A079 9 9 ]6899 	2 	2MM&-00111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2:;af 5/4[/A079 9 9 ]BOV-HIJJ 	2 	2MM&-00111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2!                 s[   AE/+(BE/B#	#E/&B#	'A(E/(E7E/E	E/
E	E//E36E3c                       e Zd ZdZd Zd ZdS )CancelFlightServerzA server for testing StopToken.c                     t          j        g           }t           j                            g |          }t	          j        |t          j        |                    S )Nr  )r>   ro   r   rA   r
   r   r  r  )rg   rs   rx   ro   r%   s        r   r{   zCancelFlightServer.do_getT	  sG    2^''6'::%fi.>r.B.BCCCr   c                 @   t          j        g           }t           j                            g |          }|                    |           |                                s?|                    |           t          j        d           |                                =d S d S )Nr  r  )	r>   ro   r   rA   rM  r  rW  r  r   )rg   rs   r   r   r   ro   r%   s          r   r   zCancelFlightServer.do_exchangeY	  s    2^''6'::V&&(( 	r"""JsOOO &&(( 	 	 	 	 	r   N)r}   r~   r   r   r{   r   r"   r   r   r  r  Q	  s;        ))D D D
    r   r  c                     t          j                    j        t          j                    j        k    rt	          j        d           d t          t          j        ffd} t                      5 }t          d|j        f          5 }|                    t          j        d                    } | |j                   t          j                            d          }|                    |          \  }} | |j                   	 |                                 n# t          t          j        f$ r Y nw xY wd d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nz'test only works from main Python threadc                  j    t          j        d           t          j        t          j                   d S r  )r  r   signalraise_signalSIGINTr"   r   r   signal_from_threadz*test_interrupt.<locals>.signal_from_threadg	  s(    
3FM*****r   c                    	 	 t          j                  }t          j                  5 }|                                  |              d d d            n# 1 swxY w Y   |                                 n# |                                 w xY wn$# t          $ r t          j        d           Y nw xY w|j        }t          |t          j        t          f          s(t          |j        t          j        t          f          sJ d S d S )Nr  z2KeyboardInterrupt didn't interrupt Flight read_all)r  r  rI  rJ  r  r  KeyboardInterruptfailrd  r  r>   ArrowCancelled__context__)r   texc_infor  	exc_typesr  s       r   r  ztest_interrupt.<locals>.testm	  s`   	N$,>???]9-- GGIIIHJJJ                 	N 	N 	N KLMMMMM	N
 N!b/1BCDD 	Nq}r'8:K&LMM	N 	N N 	N 	N 	N 	NsF   )A8 AA8 AA8 A A8 #B 8BB B32B3r   r   r?  )r  current_threadidentmain_threadrI  rg  r  r>   r  r  r   r  r{   r
   rH  r   rp   rF  r   r  r.  )r  r  r  r   r   r   r  r  s         @@r   test_interruptr  b	  s   !!'9+@+B+B+HHH=>>>+ + + #B$56IN N N N N N$ 
		 +v{3448>v}S1122V_,88AA
++J77V_	LLNNNN!6#>? 	 	 	D	                                s[   3E
A?E
DED85E7D88E;EE	EE	EE#&E#c                  .   d} t                      5 }t          j        d|j        f          5 }t	          j        t          j        |           5  |                    t          j        d                    	                                 d d d            n# 1 swxY w Y   |                    t          j        d                    	                                }|j
        dk    sJ 	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nz'application server implementation errorr   r  r   r  r9   )r  r
   r  r  rI  rJ  r  r{   rH  r   r^  )r  r  r  rz   s       r   test_never_sends_datar  	  s   5E	#	%	% #NK566#:@]635AAA 	9 	9MM&-,,--66888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9
 fmM::;;DDFF~"""""# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #sY   D
!C2:BC2BC2BA	C2&D
2C6	6D
9C6	:D

DDc            	      |   t           j                            ddz            } t                      5 }t          j        d|j        f          5 }t          j        t          d          5  |	                    | t          j        g                     \  }}|                                 d d d            n# 1 swxY w Y   t          j        t          j        d          5  |                    |            d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr1  r2  r   z%Failed to serialize Flight descriptorr  )r
   rp   rF  r   r  r  rI  rJ  OSErrorr   r>   ro   r  r  r   )large_descriptorr  r  r   r  s        r   test_large_descriptorr  	  s+   
 .:: 			 1vNK5661:@]7!HJ J J 	 	&6	"FFIFALLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ]2,!HJ J J 	1 	1/000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1s~   D1D)A B5)D5B99D<B9=#D D6DDD	D
DD1D	D1 D	!D11D58D5c            	         t           j                            d          } ddz  }t                      5 }t          j        d|j        f          5 }t          j        t          j	        d          5  |
                    | t          j        g                     \  }}|5  |                    |           |                                 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          j        t          j	        d          5  |                    |           \  }}|5  |                    |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   ~t                      5 }t          j        d|j        f          5 }t          j        t           j        d          5  |                    t          j        d                    }|                                 d d d            n# 1 swxY w Y   t          j        t          j        d          5  |                    |           \  }}|5  |                                 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   r1  r2  r   zapp_metadata size overflowr  )r
   rp   rF  r   r  r  rI  rJ  r>   ArrowCapacityErrorr   ro   rQ  r  r   r/  r  r{   rH  r   r  )r   rp  r  r  r   r  r   s          r   test_large_metadata_clientr  	  sj    (44S99J{#H			 0vNK5660:@]20!=? ? ? 	 	j")B--@@IFA  %%h///              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ]20!=? ? ? 	0 	0#//
;;NFF 0 0%%h///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 		"	$	$ 
"NK566
":@]63!=? ? ? 	 	]]6=#5#566FOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ]2,!=? ? ? 	" 	"#//
;;NFF " "!!!" " " " " " " " " " " " " " "	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
"sg  F!F0.C+*C	C+CC+CC+F+C//F2C/3#FE*1E	E*EE*EE*F*E..F1E.2F5FF	FF		FFF2K$!K/<H7+K7H;;K>H;?#K"J5=J	J5J""J5%J"&J5)K5J99K<J9=K K$K	K$K	K$$K(+K(c                       e Zd ZdZg Zd ZdS )ActionNoneFlightServerz@A server that implements a side effect to a non iterable action.c                     |j         dk    r-t          j        | j                                      d          gS |j         dk    r| j                            d           d S t          )N	get_valuer   r  T)rI   jsondumpsVALUESr   r  r   r   s      r   r   z ActionNoneFlightServer.do_action	  s`    ;+%%Jt{++227;;<<[H$$Kt$$$4!!r   N)r}   r~   r   r   r  r   r"   r   r   r  r  	  s.        JJF" " " " "r   r  c                     t                      5 } t          d| j        f          5 }|                    t	          j        dd                     |                    t	          j        dd                    }t          j        t          |          j	        
                                          dgk    sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zEnsure that actions are executed even when we don't consume iterator.

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

    See https://issues.apache.org/jira/browse/ARROW-16592.
    rE   r^  )r  r   r6  c                   $    e Zd Z fdZ fdZdS )0test_write_error_propagation.<locals>.FailServerc                     r   r"   rg   rs   r   r   r   excs        r   r   z7test_write_error_propagation.<locals>.FailServer.do_put	      Ir   c                     r   r"   r  s        r   r   z<test_write_error_propagation.<locals>.FailServer.do_exchange	  r  r   N)r}   r~   r   r   r   )r  s   r   
FailServerr  	  sG        	 	 	 	 		 	 	 	 	 	 	r   r  r   c                  ^    	 	                                    # t          j        $ r Y d S w xY wr   )r'   r
   FlightErrorr   s   r   _readerz-test_write_error_propagation.<locals>._reader
  sD    "KKMMM"%       ,,Tr  rK   r  Nc                  ^    	 	                                    # t          j        $ r Y d S w xY wr   )rt  r
   r  r  s   r   r  z-test_write_error_propagation.<locals>._reader
  sI    (%%'''(%   r  r1  )r
   r.  rp   rF  r>   ro   r6  r   r   r  r   r  r  r  rI  rJ  rW  r7  rd  r  r  r  r   rQ  )expected_messageexpected_infor   ro   r  r  r  r   r  r  r  r  r   s              @@r   test_write_error_propagationr#  	  sQ    M

%]4 4 4C(44S99JY"(**-.//F      V,    
 /+v{344/8>z6::	 	 	 	 	 !>>>]6677 	J8J""2?QC5#H#H#HIIIJ	J 	J 	J 	J 	J 	J 	J 	J ~(M9999]6677 	8LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	~(M9999  ++J77	 	 	 	 	 !>>>]6677 	,8,%%d+++,	, 	, 	, 	, 	, 	, 	, 	, ~(M9999]6677 	8LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	~(M9999_/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /s   K/A'K.D44D88K;D8<3K/FKFKFBK&H>>IKI3K9JKJK!J")KK/K	K/K	K//K36K3c                  .    t          j        d           dS )z
    Ensure that the gRPC server is stopped at interpreter shutdown.

    See https://issues.apache.org/jira/browse/ARROW-16597.
    zarrow_16597.pyN)r	   invoke_scriptr"   r   r   test_interpreter_shutdownr&  2
  s     	'(((((r   c                       e Zd ZdZd ZdS )TracingFlightServerz/A server that echoes back trace context values.c                 r    |                     d          j        }d |                                D             S )Ntracingc              3   P   K   | ]!\  }}| d |                      d          V  "dS )z: r   N)r   )r  r1   rd  s      r   	<genexpr>z0TracingFlightServer.do_action.<locals>.<genexpr>C
  sV       ; ; S% ""5""**733 ; ; ; ; ; ;r   )r  trace_contextr  )rg   rs   r   r-  s       r   r   zTracingFlightServer.do_action>
  sE    ..y99G; ;$1$7$7$9$9; ; ; 	;r   Nr  r"   r   r   r(  r(  ;
  s)        99; ; ; ; ;r   r(  c                  >   t          dt          j                    i          5 } t          d| j        f          5 }t          j        ddg          }|                    d|          D ]}	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )	Nr*  rJ  r   )s   traceparents7   00-000ff00f00f0ff000f0f00ff0f00fff0-000f0000f0f00000-00)s
   tracestater   rC  )r   r   rw   )r(  r
   TracingServerMiddlewareFactoryr   r  r   r   )r  r  rf   rd  s       r   test_tracingr0  G
  sH   	v<>>) 
 
 
 
+v{344 9? *5 	4
    %%j'%BB 	 	E	                                s4   B2A:.B:A>	>BA>	BBBwin32z6Opentelemetry traces don't appear on stdout on Windowsc                  D   t                      st          j        d           d} t          j                                        }d|d<   d|d<   t          j        t          j	        d| g|d	          }|j
        d
k    sJ |j                    d}d|j        v s
J |            d S )Nz"Arrow not built with OpenTelemetrya  if 1:
        import pyarrow.flight as flight
        from pyarrow.flight import FlightServerBase, FlightClient

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

        with SimpleServer(
            middleware={"otel": flight.TracingServerMiddlewareFactory()}
        ) as server:
            with FlightClient(('localhost', server.port)) as client:
                list(client.do_action((b"", b"")))
        ostreamARROW_TRACING_BACKENDzpyarrow-testing-serviceOTEL_SERVICE_NAMEz-cT)envcapture_outputr   z%Expected service name in trace outputs%   service.name: pyarrow-testing-service)r   rI  rg  r   r   copy
subprocessrunsys
executable
returncodestderrstdout)coder6  resmsgs       r   +test_tracing_server_middleware_emits_tracesrC  Z
  s    
 $%% :8999D *//

C#,C 8C
.#.$53(,. . .C>Q

1C3szAAA3AAAAAr   c                      t          dd          } d}t          j        t          |          5  |                     t
          j                            d          d            d d d            d S # 1 swxY w Y   d S )Nzgrpc+tls://localhost:9643Tre  zRArgument 'schema' has incorrect type \(expected pyarrow.lib.Schema, got NoneType\)r  rE   r  )r   rI  rJ  rK  r   r
   rp   rF  )r  rB  s     r   .test_do_put_does_not_crash_when_schema_is_nonerE  y
  s    56:< < <F<C	y	,	,	, # #f-99%@@! 	 	# 	# 	## # # # # # # # # # # # # # # # # #s   5A11A58A5c                      G d dt                     }  G fddt                    } G d dt                     |            } |             5 }t          d|j        f|g          5 }|                    t          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           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z9Ensure that server-sent headers/trailers make it through.c                       e Zd Zd ZdS ):test_headers_trailers.<locals>.HeadersTrailersFlightServerc                    |                     dd           |                     dd           |                    dd           |                    dd           t          j        t	          j        g           |g           S )	Nx-headerheader-valuex-header-binzheadervalue	x-trailertrailer-valuex-trailer-binztrailervalue)
add_headeradd_trailerr
   rn   r>   ro   r   s      r   r   zJtest_headers_trailers.<locals>.HeadersTrailersFlightServer.get_flight_info
  s    z>:::~/@AAA_===1CDDD$	"  r   N)r}   r~   r   r   r"   r   r   HeadersTrailersFlightServerrH  
  s#        		 		 		 		 		r   rR  c                        e Zd Zd Z fdZdS )?test_headers_trailers.<locals>.HeadersTrailersMiddlewareFactoryc                     g | _         d S r   rC  r  s    r   rd   zHtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.__init__
  s    DLLLr   c                      |           S r   r"   )rg   r   HeadersTrailersMiddlewares     r   r  zJtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.start_call
  s    ,,T222r   N)r}   r~   r   rd   r  )rW  s   r    HeadersTrailersMiddlewareFactoryrT  
  s=        	 	 		3 	3 	3 	3 	3 	3 	3r   rX  c                       e Zd Zd Zd ZdS )8test_headers_trailers.<locals>.HeadersTrailersMiddlewarec                     || _         d S r   r  r  s     r   rd   zAtest_headers_trailers.<locals>.HeadersTrailersMiddleware.__init__
  s    "DLLLr   c                     |                                 D ]+\  }}|D ]#}| j        j                            ||f           $,d S r   )r  r  r  r  )rg   r  r1   r  rd  s        r   r  zItest_headers_trailers.<locals>.HeadersTrailersMiddleware.received_headers
  s[    &}} > >V# > >EL(//e====>> >r   N)r}   r~   r   rd   r  r"   r   r   rW  rZ  
  s2        	# 	# 	#	> 	> 	> 	> 	>r   rW  r   rJ  r   )rJ  rK  )rL  s   headervalue)rM  rN  )rO  s   trailervalueN)
r   r   r   r   r  r   r
   rp   rq   r  )rR  rX  r  r  r  rW  s        @r   test_headers_trailersr]  
  s   
 
 
 
 
&6 
 
 
3 3 3 3 3 3 3+B 3 3 3> > > > >$4 > > > /.00G	$	$	&	& I&+v{3	JJJINTv6??CCDDD+w>>>>3wFFFF-@@@@5HHHHHI I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I Is7   C/+ACC/C	C/C	C//C36C3c                    	 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                            |          }|                    |t          j	        t          j                            d                              \  }}|5  |                    |j        t          j                            |dk                         |                    |           |                                 |                                }d d d            n# 1 swxY w Y   |                    |          sJ |j        	|         k    sJ .	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   rM   rL   rK   r   r  )dict_deltasdict_replacementc                       e Zd Z fdZdS )Dtest_flight_dictionary_deltas_do_exchange.<locals>.DeltaFlightServerc                    t                      }|                                }|                    |          sJ |j        |j                                                 k    sJ |j        dk    rQt          j                            d          }|	                    |j
        |           |                    |           |j        dk    r1|	                    |j
                   |                    |           d S d S )Ns   dict_deltasTemit_dictionary_deltasrw   s   dict_replacement)rT   r   r   r   r:  r  r>   r  r  rM  ro   rN  )	rg   rs   r   r   r   expected_tablereceived_tablerf   expected_statss	           r   r   zPtest_flight_dictionary_deltas_do_exchange.<locals>.DeltaFlightServer.do_exchange
  s    /11N#__..N!((88888<>*2D2K2K2M2M#NNNNN!^33&000MM^2GDDD"">222!%888^2333"">22222 98r   N)r}   r~   r   r   )rh  s   r   DeltaFlightServerrb  
  s.        	3 	3 	3 	3 	3 	3 	3r   ri  r   Trd  )write_optionsrw   r_  )r   r^   r   r  rT   r
   rp   rF  r   r   r>   r  r  rM  ro   rN  r  r   r   r   )
ri  r  r  rf  r:  r   r   r   rg  rh  s
            @r   )test_flight_dictionary_deltas_do_exchangerk  
  s     #$"#&'
 
 
 & #$"#&'
 
 
 N"3 3 3 3 3 3 30 3 3 3 
			 ;+v{344;8>+--: 	; 	;G0<<WEEJ#//0"$&"8"8/3 #9 #5 #5   0  NFF  3 3^2BF<R<R,3},D =S =G =G H H H"">222##%%%!'!2!23 3 3 3 3 3 3 3 3 3 3 3 3 3 3 "((88888<>'#::::::%	;; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;s\   
G!B F-!A<E)	F-)E--F-0E-1/F-!G-F1	1G4F1	5GG	G	c                     | j         dk    rdd d d dS | j         dk    rYddgt          j                            d          t          j                            d	t          j        j        j        
          dS i S )NdefaultrM   )r  r  rj  r  allr  )s   abcs   defzstd)compressionF)use_threadsensure_alignment)paramr>   r  r  r   	AlignmentDataTypeSpecific)requests    r   call_options_argsrw  
  s    }	!!! 	
 
 	
 
%		()V333GGF11!!#!1!B 2  	
 
 	
 	r   rw  rm  rn  T)indirectc                     t          di | }|                                }|                                 D ]\  }}|||v sJ | d| |v sJ d S )N=r"   )r   __repr__r  )rw  call_optionsr]  r  vals        r   test_call_options_reprr~  
  s     %99'899L  ""D%++-- & &S;$;;;;~~~~%%%%%& &r   )r  r  r  r   r    r  r   r9  r;  r  r  r  r)   r  r   numpyr  ImportErrorrI  r   r>   pyarrow.libr   r   r   r   pyarrow.utilr   pyarrow.testsr	   r
   r   r   r   r   r   r   r   r   r   r   rL  mark
pytestmarkr   r#   r.   r5   rC   rT   r\   r^   r   r   r   r   r   r   r   r   r   r  r  r  r#  r<  rg  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r*  r/  rX  r  r  r  r  slowr  r  r  r  pandasr  r  r  r  r  r  r  r  r  r  skipifr  r  r  r  r  r  r  r  r  r  r  r  r!  r&  r4  r(  r.  r1  r5  r7  %header_auth_server_middleware_factoryr<  r?  rA  rH  rN  rR  rU  rX  requires_testing_datar_  rc  rh  rl  rr  rx  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  large_memoryr  r  r  r  r#  r&  r(  r0  platformrC  rE  r]  rk  fixturerw  parametrizer~  r"   r   r   <module>r     s  $ 


      				        



                    	BBB      T T T T T T T T T T T T ' ' ' ' ' '                                F%+V"L"+16((06--06-- [
  
B B B
 
 
  "; ; ;
< 
< 
<2 2 2E E E E E+ E E ED& & & & &+ & & &R    '   *" " " " "- " " """ " " " ""2 " " """ " " " ".> " " ""0 0 0 0 0* 0 0 06+ + + + +. + + +    #3   . . . . .. . . ."E E E E E 0 E E E F F F F F!1 F F F&7 7 7 7 7' 7 7 7*.A .A .A .A .A( .A .A .AbJ# J# J# J# J#+ J# J# J#Z    !2   0    !2   "    .   .    .   $    '   $ $ $
/ 
/ 
/ 
/ 
/(? 
/ 
/ 
/1 1 1 1 1!1 1 1 161 1 1 1 1(? 1 1 189 9 9 9 9!1 9 9 9/ / / / /- / / /9 9 9 9 9.E 9 9 9    '7   F F F F F#3 F F F*+ + + + +- + + +5 5 5 5 5$; 5 5 5    )       .   - - - - -+B - - -&/ / / / /+B / / /

 
 
 
 
$4 
 
 
	 	 	 	 	'> 	 	 		 	 	 	 	'> 	 	 		1 	1 	1 	1 	1)@ 	1 	1 	12 2 2 2 2"2 2 2 2.4 4 4 4 4)@ 4 4 44 4 4 4 4"2 4 4 4. . . . . 0 . . ."J@ J@ J@Z` ` `F! ! !$8 8 8      (' ' '( ( (D D D6 F F F
 
 
$" " "< < <.= = =7 7 7$    (   2! ! !6 6 6   BGtOD  F F& &F F&* # # #*# # # # # #*# # # # # #*# # # # # #*9 9 9< < <J J J4 4 4" 0/[7     ,+[3    
 + + + BGtOI  K K
5 
5K K
5+ + +5 5 5I I I )J(I(K(K %$_&& 4 4 4E E E; ; ;  @8 8 8." " "+ + + "= = #" = "	" 	" #"	" "  #"  "	2 	2 #"	2" " "*     @
" 
" 
") ) ), " " "8       4 4  4@  8O 8O 8Ov# # #L$( $( $(N	' 	' 	'9 9 9,)5 )5 )5X	5 	5 	5 "" " #""$! ! !2 2 20(F (F (FV2 2 20! ! !.B B B, "  #".    )   " ) ) )X# # # 1 1  1  " "  "@
" 
" 
" 
" 
"- 
" 
" 
"
? 
? 
? C C CL) ) )	; 	; 	; 	; 	;* 	; 	; 	;  & CLG+S  U UG GU UG:# # #&I &I &IR5; 5; 5;p   , )U+d  < <
& 
&< <
& 
& 
&s$    A AA3B B0/B0