
    2pi                         d dl Zd dlmc mZ d dlZd dlZd dlZd dl	Z	d dl
mZmZ d dlZd dlmZ  G d de          Z ej        d          d             Zd	 Zd
 Zd Zd ZdS )    N)
HTTPServerBaseHTTPRequestHandler)RemoteLLMClientc                   "    e Zd ZdZdZd Zd ZdS )TestHandlerokr   c                     |                      d           |                     dd           |                                  | j                            d           d S )N   Content-Typez
text/plains   OK)send_responsesend_headerend_headerswfilewrite)selfs    8/home/asher/github/pulse/tests/test_remote_llm_client.pydo_GETzTestHandler.do_GET   sZ    3666
    c                    t          | j                            dd                    }|r| j                            |          nd}t
          xj        dz  c_        | j                            d          r| 	                    d           | 
                    dd           |                                  | j                            d	           | j                                         t          j        d
           | j                            d           | j                            d           | j                                         d S t
          j        dk    r| 	                    d           | 
                    dd           |                                  ddd}| j                            t%          j        |                              d                     d S t
          j        dk    rt
          j        dk    rE| 	                    d           |                                  | j                            d           d S | 	                    d           | 
                    dd           |                                  ddd}| j                            t%          j        |                              d                     d S t
          j        dk    rE| 	                    d           |                                  | j                            d           d S t
          j        dk    rt          j        d           | 	                    d           | 
                    dd           |                                  ddd}| j                            t%          j        |                              d                     d S d S )NzContent-Lengthr   r      z	?stream=1r
   r   ztext/event-streams   data: chunk1

g{Gz?s   data: chunk2

s   data: [DONE]

r   zapplication/jsontest)responseproviderzutf-8500_then_oki  s   Internal Errorok_after_retrystreamslowg?slow_ok)intheadersgetrfilereadr   counterpathendswithr   r   r   r   r   flushtimesleepmodejsondumpsencode)r   lengthbodyresps       r   do_POSTzTestHandler.do_POST   s   T\%%&6::;;*09tzv&&&cq 9k** 	s###^-@AAAJ0111JJtJ0111J0111JFt##s###^-?@@@ $&99DJTZ--44W==>>>F},,"a''""3'''  """
  !2333""3'''  1CDDD  """$4&II
  D!1!1!8!8!A!ABBBx''s###J.///Fv%%JsOOOs###^-?@@@ )v>>DJTZ--44W==>>>F &%r   N)__name__
__module____qualname__r*   r$   r   r1    r   r   r   r   
   s<        DG     6 6 6 6 6r   r   module)scopec               #     K   d } t          dd          D ]+}	 t          d|ft                    }  n# t          $ r Y (w xY wd }| |u}|st	          j        d|fd| |f          dt          j                    v st	          j        |           rt	          j	        |           ndt	          j	        |          dz  }dd	|iz  }t          t	          j        |                    d x}}t          j        | j        d
          }|                                 d| j         V  |                                  |                    d           d S )Ni  i   z	127.0.0.1)is not)z%(py0)s is not %(py3)sserverpy0py3assert %(py5)spy5T)targetdaemonzhttp://127.0.0.1:r   )timeout)ranger   r   OSError
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation	threadingThreadserve_foreverstartserver_portshutdownjoin)r:   port@py_assert2@py_assert1@py_format4@py_format6threads          r   http_serverrZ   O   s      FdD!!  	d 3[AAFE 	 	 	H	6666V%9$GGGF
LLNNN
2f0
2
2222
OO
KKKs   1
>>c                 4   dt           _        t          | dz             }|j        }d}||u }|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          t	          j	        |          dz  }dd	|iz  }t          t	          j        |                    d x}x}}|                    d
          }d}	||	k    }|st	          j        d|fd||	f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |	          dz  }
dd|
iz  }t          t	          j        |                    d x}}	d S )Nr   /askT)is)z1%(py2)s
{%(py2)s = %(py0)s.available
} is %(py5)sc)r<   py2r?   zassert %(py7)spy7hello==z%(py0)s == %(py3)srr;   r>   r?   )r   r*   r   	availablerE   rF   rG   rH   rI   rJ   rK   rL   ask)rZ   monkeypatchr^   rV   @py_assert4@py_assert3rX   @py_format8re   rU   rW   s              r   test_direct_json_responserl   a   s   Kf,--A;$;$;$11;$	gA19111r   c                    dt           _        dt           _        |                    dd           t	          | dz             }|                    d          }d}||k    }|st          j        d|fd	||f          d
t          j	                    v st          j
        |          rt          j        |          nd
t          j        |          dz  }dd|iz  }t          t          j        |                    d x}}d S )Nr   r   LLM_RETRY_COUNT2r\   ra   r   rb   rd   re   r;   r>   r?   )r   r*   r$   setenvr   rg   rE   rF   rG   rH   rI   rJ   rK   rL   )rZ   rh   r^   re   rU   rV   rW   rX   s           r   test_retry_on_500_then_successrq   i   s   $KK(#...f,--A	gA  1           1             1     1                                  r   c                 z   dt           _        dt           _        t          | dz             }|                    d          }g }d}||v }|}|rd}||v }	|	}|sXt          j        d|fd||f          t          j        |          d	t          j	                    v st          j
        |          rt          j        |          nd	d
z  }
dd|
iz  }|                    |           |rt          j        d|	fd||f          t          j        |          d	t          j	                    v st          j
        |          rt          j        |          nd	dz  }dd|iz  }|                    |           t          j        |d          i z  }dd|iz  }t          t          j        |                    d x}x}x}x}x}}	d S )Nr   r   r\   ra   chunk1chunk2)in)z%(py3)s in %(py5)sre   )r=   r?   z%(py7)sr`   )z%(py10)s in %(py12)s)py10py12z%(py14)spy14zassert %(py17)spy17)r   r*   r$   r   rg   rE   rF   rJ   rG   rH   rI   append_format_booloprK   rL   )rZ   rh   r^   re   rV   rU   ri   @py_assert0@py_assert9@py_assert11rX   rk   @py_format13@py_format15@py_format16@py_format18s                   r   test_streaming_fallback_on_500r   r   s   KKf,--A	gA**8*8q=*****X*X]***********8q*****8***********q*****q*****************************X*****X***************************************************************************r   c           	         dt           _        dt           _        g fd}|                     d|           |                     dd           |                     dd           t          |d	z             }|                    d
          }d}||k    }|st          j        d|fd||f          dt          j
                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }t          t          j        |                    d x}}t                    }d}	||	k    }
|
st          j        d|
fd||	f          dt          j
                    v st          j        t                    rt          j        t                    nddt          j
                    v st          j                  rt          j                  ndt          j        |          t          j        |	          dz  }dd|iz  }t          t          j        |                    d x}x}
}	t           j        }d         }d}	 |||	          }d}||k    }|st          j        d|fd||f          dt          j
                    v st          j        t                     rt          j        t                     ndt          j        |          t          j        |          t          j        |	          t          j        |          t          j        |          dz  }dd |iz  }t          t          j        |                    d x}x}x}	x}x}}d S )!Nr   r   c                 2                         |            d S )N)rz   )ssleepss    r   
fake_sleepz,test_retry_backoff_sleep.<locals>.fake_sleep   s    ar   z
time.sleeprn   ro   LLM_RETRY_BACKOFFz0.1r\   ra   r   rb   rd   re   r;   r>   r?   r   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slenr   )r<   py1r=   py6zassert %(py8)spy8g?)rel)zZ%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.approx
}(%(py4)s, rel=%(py6)s)
} == %(py11)spytest)r<   r_   py4r   r   py11zassert %(py13)spy13)r   r*   r$   setattrrp   r   rg   rE   rF   rG   rH   rI   rJ   rK   rL   r   r   approx)rh   rZ   r   r^   re   rU   rV   rW   rX   @py_assert5ri   @py_format7@py_format9rj   @py_assert7@py_assert10r}   @py_format12@py_format14r   s                      @r   test_retry_backoff_sleepr   {   s   $KKF     j111(#...*E222f,--A	gA  1           1             1     1                                v;;!;!;!33vv;!=333==,,,33,3333333333,3333333333336333336333333=333333333333,333333333333333333333333333333333333333r   )builtinsrG   _pytest.assertion.rewrite	assertionrewriterE   rM   r(   r+   sockethttp.serverr   r   r   pulser   r   fixturerZ   rl   rq   r   r   r5   r   r   <module>r      s                        : : : : : : : :  ! ! ! ! ! !B B B B B( B B BJ h   "  ! ! !+ + +4 4 4 4 4r   