
    $/i                        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
Z
d dlZd dlmZmZmZ d dlmZmZmZ d dlmZ d dlmZ ej0                  d        Zej4                  j                  d        Zej4                  j                  d        Zej4                  j                  d	        Zej4                  j                  d
        Zej4                  j                  d        Zej4                  j                  d        Z ej4                  j                  d        Z!ej4                  j                  d        Z"ej4                  j                  d        Z#ej4                  j                  d        Z$e%dk(  r ejL                  e'g       yy)    N)	MagicMockpatch	AsyncMock)BrowserControllerNavigationStatusBrowserConfig)GeminiLiveSession)VisionWorkerc                    K   t               } | j                          d {   }|sd  y |  | j                          d {    y 7 *7 w)N)r   
initializeclose)
controllerinitializeds     :/mnt/e/genesis-system/tests/stress/test_resource_stress.pybrowserr      sJ     "$J"--//K
    0
 	!s!   AA$AAAAc                    K   t        t        d            } | j                          d{    | j                  s-| j	                          d{    t        j                  d       	 t        d      D ]  }| j                  d| d       d{    ! | j                  }t        |      }d	}||k  }|s
t        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                   |      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            dx}x}x}}| j	                          d{    y7 7 7 Y7 # | j	                          d{  7   w xY ww)zDVerify memory stability after simulated continuous vision streaming.T)headless)configNBrowser init failed
   z data:text/html,<html><body>Page z</body></html>d   )<=)zN%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s._history
})
} <= %(py8)slenr   py0py1py3py5py8assert %(py10)spy10)r   r   r   _active_backendr   pytestskiprangenavigate_historyr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)r   i@py_assert2@py_assert4@py_assert7@py_assert6@py_format9@py_format11s           r   test_memory_stability_long_runr7      sq     #-*FGJ 


!!!%%   )*	!r 	\A%%(H>&Z[[[	\ &&.s&'.3.'3....'3......s...s......:...:...&...'...3.......     "  \ 	!j   sj   *HG$#HG'H+&G/ G*D9G/ HG-H'H*G/ -H/H
HH

Hc                   K   | st        j                  d       | j                  }|j                         dk(  rg }	 |j                  }t        d      D ]+  }|j                          d{   }|j                  |       - |j                  }t        |      }d}||k\  }	|	s
t        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                  |      t        j                  |      d	z  }
d
d|
iz  }t!        t        j"                  |            dx}x}x}	}|D ]  }|j%                          d{     yy7 l7 # |D ]  }|j%                          d{  7    w xY ww)z9Verify browser controller stability with concurrent tabs.r   
Playwrightr   N)>=)zK%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.pages
})
} >= %(py8)sr   contextr   r    r!   )r#   r$   r"   name_contextr%   new_pageappendpagesr   r(   r)   r*   r+   r,   r-   r.   r/   r   )r   backendr@   r;   _pr1   r2   r3   r4   r5   r6   s               r   test_concurrent_tabs_stressrD   /   sZ     FKK 56 %%G||~%	,&&G2Y  !**,,Q  }}+3}%++%++++%++++++3+++3++++++w+++w+++}+++%+++++++++++!'')OO+ & - ,U+!'')OO+sM   :H -G *G+E
G 5H GH G H G=4G7
5G==H c                    K   t               } t               | j                  _        t        |       }d|_        t        j                         }|j                  d      }t        j                  d       d{    |j                  d      }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}}y7 ĭw)z!Verify CPU usage of VisionWorker.)browser_controllerTg?)intervalg      ?NFg     V@<z%(py0)s < %(py3)scpu_endr   r   assert %(py5)sr   )r   r"   _pager
   
is_runningpsutilProcesscpu_percentasynciosleepr(   r)   r*   r+   r,   r-   r.   r/   )	mock_controllerworkerrC   	cpu_startrK   r1   @py_assert1@py_format4@py_format6s	            r   test_cpu_usage_limitr[   C   s       kO,5KO##)_=F FAs+I --
mmSm)GF 7T>7T77T s   A5D>7D<8CD>c                    K   t               } t        j                         | _        t        j                         | _        t        d      D ]  }| j
                  j                  d        | j
                  }|j                  } |       }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                   |            d	x}x}x}x}}y	w)
z8Verify GeminiLiveSession audio buffer overflow handling.r   s   chunk==)ze%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.audio_queue
}.qsize
}()
} == %(py9)ssession)r   py2py4py6py9zassert %(py11)spy11N)r	   rS   get_running_looploopQueueaudio_queuer%   
put_nowaitqsizer(   r)   r*   r+   r,   r-   r.   r/   )	r_   rB   rX   @py_assert3@py_assert5@py_assert8r3   @py_format10@py_format12s	            r   test_audio_buffer_overflowrp   ^   s       !G++-GL!--/G 3Z 1&&x01 -$$-$&-#-&#----&#------7---7------$---&---#--------s   E0E2c                     K   yw)z!Verify logging doesn't spam disk.N rr       r   test_disk_io_limitsrt   m   s      	s   c                   K   | st        j                  d       | j                  }|j                         dk(  r|j                  r{|j                  j                          d{    	 | j                  d       d{    d}|s8ddt        j                  |      iz  }t        t        j                  |            d}yyy7 _7 G# t        $ r Y Pw xY ww)z1Verify BrowserController recovery from OOM crash.r   r9   Nzhttps://example.comTassert %(py1)sr   )r#   r$   r"   r<   _browserr   r&   	Exceptionr(   r-   r.   r/   )r   rA   @py_assert0@py_format2s       r   test_oom_recoveryr{   s   s      FKK 56%%G||~% ""((***&&'<=== K4KKK4KKKKKK# 	 &
 + > sI   A C"C#C(C <C=C ACC 	CCCCc                    K   ddl m}   | d      }t        d      D ]  }|j                  |        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}}|d   }d}	||	k(  }|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t        t        j                  |            dx}x}}	yw)zVerify history decrements.r   )deque2   )maxlenr   r]   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   d)r   r   r   rb   zassert %(py8)sr   Nz%(py1)s == %(py4)sr   ra   assert %(py6)srb   )collectionsr}   r%   r?   r   r(   r)   r*   r+   r,   r-   r.   r/   )r}   r   r0   r1   rl   r2   @py_format7r5   ry   rk   @py_format5s              r   test_history_pruningr      s     "RA3Z 	q6R6R<6R33qq6RQ4242:4242s   GGc                    K   t               fd} t        j                  t        d      D cg c]	  } |         c}  d{    j                  d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            dx}x}}yc c}w 7 w)
z$Verify stats tracking thread safety.c                  ~   K    j                   5   j                  dxx   dz  cc<   d d d        y # 1 sw Y   y xY ww)Ntotal_navigations   )_stats_lock_stats)r   s   r   update_statz-test_stats_thread_safety.<locals>.update_stat   s;     ## 	812a72	8 	8 	8s   =1	=:=r   Nr   r]   r   r   r   rb   )
r   rS   gatherr%   r   r(   r)   r-   r.   r/   )r   rB   ry   rk   r1   r   r   r   s          @r   test_stats_thread_safetyr      s      #$J8
 ..%*=Q;==
>>>018S81S88881S8881888S8888888 >>s   ,CCCCBCc                    K   ddl m}   |        }t        d      D ci c]  }d| d|  c}|_        t	        j                         }|j                  d      }t	        j                         |z
  }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}||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}}yc c}w w)zVerify lookup speed.r   )GHLSynergyBridgei'  keyvalkey5000val5000r]   )z%(py0)s == %(py3)srL   rM   r   Ng{Gzt?rH   rJ   duration)core.ghl_synergy_bridger   r%   selector_cachetimeget_selectorr(   r)   r*   r+   r,   r-   r.   r/   )
r   bridger0   startr   r   r1   rX   rY   rZ   s
             r   test_synergy_cache_speedr      s     9F;@<Has1#Y#aS	1HFIIKE


i
(Cyy{U"H3)3)33)8e8e88e Is   GF>FGc                    K   t               } | j                          d{    | j                          d{    d}|s8ddt        j                  |      iz  }t        t        j                  |            d}y7 [7 Ew)z!Verify cleanup leaves no zombies.NTrv   r   )r   r   r   r(   r-   r.   r/   )r   ry   rz   s      r   test_zombie_cleanupr      sX      #$J



!!!



K4KKK4KKKKKK "s    B A<B A>AB >B __main__)(builtinsr*   _pytest.assertion.rewrite	assertionrewriter(   r#   pytest_asynciorS   r   	threadingrP   unittest.mockr   r   r   core.browser_controllerr   r   r   core.voice.gemini_live_sessionr	   core.vision_workerr
   fixturer   markr7   rD   r[   rp   rt   r{   r   r   r   r   __name__main__file__rr   rs   r   <module>r      s           5 5 V V < +! ! ! !, , ,&  4 . . 	 	
  :   9 9     zFKK
 rs   