
    q3piQ                         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mZ d dlZ G d de          Z G d d          Z G d d	e	j                  Zed
k    r e	j                     dS 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    A/home/asher/github/pulse/tests/test_remote_llm_client_unittest.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

{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   r3    r   r   r   r   	   s<        DG     4 4 4 4 4r   r   c                        e Zd Zd Zd Zd ZdS )RemoteLLMServerThreadc                    d | _         t          dd          D ]7}	 t          d|ft                    | _         || _         n# t
          $ r Y 4w xY w| j         st          d          t          j        | j         j	        d          | _
        d S )Ni  i   z	127.0.0.1zNo free portT)targetdaemon)serverranger   r   portOSErrorRuntimeError	threadingThreadserve_foreverthread)r   r?   s     r   __init__zRemoteLLMServerThread.__init__J   s    $%% 	 	D(+t)<kJJ 	   { 	/~...&dk.GPTUUUs   #A  
AAc                 p    | j                                          t          j        d           d| j         S )Nr   zhttp://127.0.0.1:)rE   startr*   r+   r?   r   s    r   rH   zRemoteLLMServerThread.startW   s6    
4.49...r   c                 n    | j                                          | j                            d           d S )Nr   )timeout)r=   shutdownrE   joinr   s    r   stopzRemoteLLMServerThread.stop\   s5    #####r   N)r4   r5   r6   rF   rH   rM   r7   r   r   r9   r9   I   sD        V V V/ / /
$ $ $ $ $r   r9   c                   R    e Zd Zed             Zed             Zd Zd Zd Zd Z	dS )TestRemoteLLMClientc                 h    t                      | _        | j                                        | _        d S N)r9   srvrH   baseclss    r   
setUpClasszTestRemoteLLMClient.setUpClassa   s$    '))7==??r   c                 8    | j                                          d S rQ   )rR   rM   rT   s    r   tearDownClassz!TestRemoteLLMClient.tearDownClassf   s    r   c                     dt           _        t          | j        dz             }|                     |j                   |                    d          }|                     |d           d S )Nr   /askhello)r   r,   r   rS   
assertTrue	availableaskassertEqualr   crs      r   test_direct_json_responsez-TestRemoteLLMClient.test_direct_json_responsej   s]    DI.//$$$EE'NND!!!!!r   c                     dt           _        dt           _        dt          j        d<   dt          j        d<   t          | j        dz             }|                    d          }|                     |d	           d S )
Nr   r   2LLM_RETRY_COUNTz0.01LLM_RETRY_BACKOFFrZ   r[   r   )	r   r,   r&   osenvironr   rS   r^   r_   r`   s      r   test_retry_on_500_then_successz2TestRemoteLLMClient.test_retry_on_500_then_successq   sl    ((+
$%*0
&'DI.//EE'NN,-----r   c                     dt           _        dt           _        t          | j        dz             }|                    d          }|                     d|           |                     d|           d S )Nr   r   rZ   r[   chunk1chunk2)r   r,   r&   r   rS   r^   assertInr`   s      r   test_streaming_fallback_on_500z2TestRemoteLLMClient.test_streaming_fallback_on_500z   sc    #DI.//EE'NNh"""h"""""r   c                    dt           _        dt           _        g t          j        }fd}|t          _        	 dt
          j        d<   dt
          j        d<   t          | j        dz             }|	                    d	          }| 
                    |d
           |                     t                    d           |                     d         dd           |t          _        d S # |t          _        w xY w)Nr   r   c                 2                         |            d S rQ   )append)ssleepss    r   
fake_sleepz@TestRemoteLLMClient.test_retry_backoff_sleep.<locals>.fake_sleep   s    MM!r   re   rf   z0.1rg   rZ   r[   r   r   g?r   )delta)r   r,   r&   r*   r+   rh   ri   r   rS   r^   r_   assertGreaterEquallenassertAlmostEqual)r   
real_sleepru   ra   rb   rt   s        @r   test_retry_backoff_sleepz,TestRemoteLLMClient.test_retry_backoff_sleep   s    (Z
	 	 	 	 	  
		$,/BJ().3BJ*+	F 233AgAQ 0111##CKK333""6!9c">>>#DJJJDJ####s   B!C) )C7N)
r4   r5   r6   classmethodrV   rX   rc   rj   ro   r{   r7   r   r   rO   rO   `   s        # # [#   [" " ". . .# # #$ $ $ $ $r   rO   __main__)builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arrB   r*   r-   unittesthttp.serverr   r   pulser   rh   r   r9   TestCaserO   r4   mainr7   r   r   <module>r      s"                        : : : : : : : : ! ! ! ! ! ! 				> > > > >( > > >@$ $ $ $ $ $ $ $.4$ 4$ 4$ 4$ 4$(+ 4$ 4$ 4$l zHMOOOOO r   