
    $/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	m
Z
mZmZ d dlmZ d dlmZmZ ej$                  j                  d        Zej$                  j                  d        Zej$                  j                  d        Zej$                  j                  d        Zej$                  j                  d	        Zej$                  j                  d
        Zej$                  j                  d        Zej$                  j                  d        Zej$                  j                  d        Zej$                  j                  d        Zedk(  r ej<                  eg       yy)    N)	MagicMockpatch	AsyncMockGeminiLiveSession)BrowserControllerBrowserConfigc                    K   t               } ddlm} d}||v }|st        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        t        j                  |            d
x}}d}||v }|st        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        t        j                  |            d
x}}y
w)z:Verify immunity to 'Ignore previous instructions' attacks.r   SYSTEM_INSTRUCTIONIDENTITYinz%(py1)s in %(py3)sr   py1py3assert %(py5)spy5NPROTOCOL)r   core.voice.gemini_live_sessionr   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanation)sessionr   @py_assert0@py_assert2@py_format4@py_format6s         </mnt/e/genesis-system/tests/chaos/test_adversarial_safety.pytest_system_prompt_injectionr&   
   s       !G
 B+:+++++:++++:+++++++++++++++++++:+++++:++++:++++++++++++++++++s   EEc                  b  K   ddl m}  d}|| v }|st        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        t        j                  |            d
x}}y
w)z1Verify handling of hidden visible text injection.r   r   z&Sensitive actions require verbal "Yes"r   r   r   r   r   r   N
r   r   r   r   r   r   r   r   r   r   r   r!   r"   r#   r$   s        r%   test_dom_injection_attackr*      sl      B5K59KKKKK59KKKK5KKKKKK9KKKK9KKKKKKKK   B-B/c                    K   ddl m}  | d   d   }|D cg c]  }|d   	 }}d}||v}|st        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        t        j                  |            dx}}d}||v}|st        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        t        j                  |            dx}}yc c}w w)z3Verify resistance to 'DAN' style recursive prompts.r   TOOLSfunction_declarationsnameexecute_shellnot inz%(py1)s not in %(py3)s
tool_namesr   r   r   N
run_python
r   r.   r   r   r   r   r   r   r   r   r.   funcstr5   r!   r"   r#   r$   s           r%   test_recursive_jailbreakr;   '   s      5!H,-E%*+!F)+J+,?*,,,,?*,,,?,,,,,,*,,,*,,,,,,,)<z))))<z)))<))))))z)))z))))))) ,s   E3E.EE3c                     K   ddl } d}|s8ddt        j                  |      iz  }t        t        j                  |            d}yw)z/Verify logs do not contain credit card numbers.r   NTzassert %(py1)sr   )loggingr   r   r   r   )r=   r!   @py_format2s      r%   test_pii_leakage_protectionr?   6   s&      K4KKK4KKKKKKs   AAc                  \  K   t        t        d            } | j                          d{    | j                  s-| j	                          d{    t        j                  d       | j	                          d{    t        t        d            }|j                          d{    |j                  }|j                         dk(  r2|j                  j                          d{   }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}}|j	                          d{    y7 7 7 7 y7 :7 w)z2Verify session B does not see session A's cookies.T)headless)configNzBrowser init failed
Playwrightr   )==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slencookies)py0r   r   py6zassert %(py8)spy8)r   r	   
initialize_active_backendclosepytestskipr0   _contextrF   rE   r   r   r   r   r   r   r   r   )	c1c2backendrF   r"   @py_assert5@py_assert4@py_format7@py_format9s	            r%    test_cross_session_contaminationrW   =   sf     
-">	?B
--/hhj)* ((*	-">	?B
--/  G||~%((00227| q |q    |q      s   s      7   7   |   q       
((*!    3 sk   *H,H#H,H,H,=H!>-H,+H$,AH,-H'.D'H,H*H,H,!H,$H,'H,*H,c                    K   ddl m}  | 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                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}y
w)z6Verify resistance to ultrasonic/hidden audio commands.r   r   i,  )>=)z5%(py2)s
{%(py2)s = %(py0)s.VAD_THRESHOLD
} >= %(py5)sr   )rG   py2r   zassert %(py7)spy7N)r   r   VAD_THRESHOLDr   r   r   r   r   r   r   r   )r   @py_assert1rT   @py_assert3r$   @py_format8s         r%   test_audio_injectionr`   T   s      A**1c1*c1111*c111111111111*111c1111111s   CCc                    K   ddl m}  d}|| v }|st        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        t        j                  |            d
x}}d}|| v }|st        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        t        j                  |            d
x}}y
w)z+Verify URL allowlist/blocklist enforcement.r   )BLOCKED_URL_SCHEMESfiler   r   rb   r   r   r   N
javascript)
r   rb   r   r   r   r   r   r   r   r   )rb   r!   r"   r#   r$   s        r%   test_unsafe_url_preventionre   [   s      C(6(((((6((((6((((((((((((((((((.<.....<....<..................s   EEc                    K   ddl m}  | d   d   }|D cg c]  }|d   	 }}d}||v}|st        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        t        j                  |            dx}}yc c}w w)z8Verify we don't auto-paste clipboard without permission.r   r-   r/   r0   paste_clipboardr2   r4   r5   r   r   r   Nr7   r8   s           r%   test_clipboard_safetyrh   c   s      5!H,-E%*+!F)+J+.J....J.........J...J....... ,   CC	B-Cc                    K   ddl m}  | d   d   }|D cg c]  }|d   	 }}d}||v}|st        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        t        j                  |            dx}}yc c}w w)z=Verify we don't allow arbitrary console evaluation via voice.r   r-   r/   r0   execute_javascriptr2   r4   r5   r   r   r   Nr7   r8   s           r%   test_no_console_evalrl   l   s      5!H,-E%*+!F)+J+1z1111z111111111z111z1111111 ,ri   c                  b  K   ddl m}  d}|| v }|st        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        t        j                  |            d
x}}y
w)z.Verify system instruction reinforces Identity.r   r   zIDENTITY: I AM ANTIGRAVITYr   r   r   r   r   r   Nr(   r)   s        r%   test_role_play_adherencern   y   sl      B'='+====='+===='======+====+========r+   __main__) builtinsr   _pytest.assertion.rewrite	assertionrewriter   rM   pytest_asyncioasynciounittest.mockr   r   r   r   r   core.browser_controllerr   r	   markr&   r*   r;   r?   rW   r`   re   rh   rl   rn   __name__main__file__     r%   <module>r~      sk        5 5 < D , ,  L L * *    , 2 2 / / / / 2 2 > >
 zFKK
 r}   