
    z%ity                        d dl 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Zd dl	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlZd dlZd dlmZ 	 d dlZe
j,                  s ej.                  d      d	Zej2                  d
k(  ZddZd Zed        Z G d dej<                        Ze dk(  r ejB                          yy# e$ r dZY tw xY w)    )contextmanagerN)support)	os_helper)script_helper
is_android)skip_if_sanitizer)dedentztest module requires subprocessg      ?ntc                 b    |}|d| z  z  }|d|z  z  }d|k  rd|dz   |dz
  z  z   |z   S d|z   dz   S )Nz#  File "<string>", line %s in func
z&  File "<string>", line %s in <module>   ^
$ )lineno1lineno2header	min_countregexs        J/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/test_faulthandler.pyexpected_tracebackr      sZ    E	3g==E	5??E9}edly1}55==U{S      c                 B     t        j                  t        d      |       S )Nz(raising SIGSEGV on Android is unreliable)unittestskipIfr   )tests    r   skip_segfault_on_androidr   &   s(    G8??:EGGKM Mr   c               #      K   t        j                         } 	 |  t        j                  |        y # t        j                  |        w xY wwN)tempfilemktempr   unlinkfilenames    r   temporary_filenamer%   +   s8      H#"	"s   A2 AA		Ac            	          e Zd ZdRdZddddddddddZdSdZd	 Z ej                  e	j                  j                  d
      d      d        Zed        Zed        Zd Zd Z ej                  e	j                  dk(  d      d        Z ej                  edu d       ej(                   eed      d      ed                      Z ej                  edu d       ej(                   eed      d      ed                      Zd Zd Zd Z ej                  e	j                  j                  d      d       ej                   eed        d!      d"               Zed#        Z eddd$%      ed&               Z  ej                  e	j                  dk(  d'       eddd$%      ed(                      Z!ed)        Z"ed*        Z#ed+        Z$d, Z% e&jN                         d-        Z( e&jN                         d.        Z) e&jN                         d/        Z*ddd0d1Z+d2 Z,d3 Z- ej                  e	j                  dk(  d'      d4        Z.d5 Z/d6 Z0d7 Z1d8 Z2dTddd0d9Z3d: Z4d; Z5d< Z6d= Z7 ej                  e	j                  dk(  d'      d>        Z8 e&jr                  d?      d@        Z: ej                   eedA       dB      	 	 dUdC       Z;dD Z<dE Z=dF Z> ej                  e	j                  dk(  d'      dG        Z?dH Z@dI ZAeBdJ        ZCdK ZD ej(                  eEdL      dM        ZF ej(                  eEdL      dN        ZG ej(                  eEdL      dO        ZH ej(                  eEdL      dP        ZIdQ ZJy)VFaultHandlerTestsNc                 J   	 t        |      j                         }g }||j                  |       t        j                         5  t        j                  d||      }|5  |j                         \  }}|j                         }d d d        d d d        j                  dd      }|rJ| j                  |d       t        |d      5 }	|	j                         }d d d        |j                  dd      }nr|p| j                  |d       t        j                  |t        j                  d       t        |dd	      5 }	|	j                         }d d d        |j                  dd      }|j!                         fS # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   QxY w)
N-c)pass_fdsasciibackslashreplace rbr   F)closefd)r	   stripappendr   SuppressCrashReportr   spawn_pythoncommunicatewaitdecodeassertEqualopenreadoslseekSEEK_SET
splitlines)
selfcoder$   fdr*   processoutputstderrexitcodefps
             r   
get_outputzFaultHandlerTests.get_output5   sz   	 d|!!#>OOB((* 	*#00thOG *!(!4!4!6"<<>*	*
 w(:;VR(h% ##]]7,>?F^VR(HHRa(b$. #"#]]7,>?F  "H,,* *	* 	*# ## #s<   F$E5FF8F5E>	:FF
FF"TFz<module>)r$   all_threadsother_regexr@   know_current_threadpy_fatal_errorgarbage_collectingfunctionc                   	 |r|rd}nd}nd}d| g}|	r|j                  d       |j                  d       |j                  | d       |
r|j                  d       |j                  d	| d
|        dj                  |      }|r	d| d| d}d| }| j                  |||      \  }}dj                  |      }| j                  ||       | j	                  |d       y )NzCurrent thread 0x[0-9a-f]+zThread 0x[0-9a-f]+Stackr   z!Python runtime state: initializedr-   z \(most recent call first\):z  Garbage-collectingz  File "<string>", line z in r   z(?:|)z(?m)r$   r@   r   )r1   joinrF   assertRegexassertNotEqual)r>   r?   linenofatal_errorr$   rG   rH   r@   rI   rJ   rK   rL   r   r   rB   rD   s                   r   check_errorzFaultHandlerTests.check_errorV   s    	 "5-F[M"#LL<=R <=>LL/00XJGH		% %+a0E ug??4(r?J6"'Ha(r   c                 J    |r|d|}d|z  } | j                   |||fi | y )Nz: zFatal Python error: %srW   )r>   r?   line_number
name_regexfunckwrV   s          r   check_fatal_errorz#FaultHandlerTests.check_fatal_error}   s2    %):6J.;{K>2>r   c                 8    d|z  } | j                   |||fi | y )NzWindows fatal exception: %srY   )r>   r?   rZ   r[   r]   rV   s         r   check_windows_exceptionz)FaultHandlerTests.check_windows_exception   s%    3j@{K>2>r   aixz5the first page of memory is a mapped read-only on AIXc                 ^    t         s| j                  ddd       y | j                  ddd       y )Nz
                import faulthandler
                faulthandler.enable()
                faulthandler._read_null()
                   z4(?:Segmentation fault|Bus error|Illegal instruction)access violation)
MS_WINDOWSr^   r`   r>   s    r   test_read_nullz FaultHandlerTests.test_read_null   sA     "" $
 ,	- (( *
 "$r   c                 *    | j                  ddd       y )Nzs
            import faulthandler
            faulthandler.enable()
            faulthandler._sigsegv()
            rc   Segmentation faultr^   rf   s    r   test_sigsegvzFaultHandlerTests.test_sigsegv         
  	"r   c                 0    | j                  ddddd       y )Na  
            import faulthandler
            import gc
            import sys

            faulthandler.enable()

            class RefCycle:
                def __del__(self):
                    faulthandler._sigsegv()

            # create a reference cycle which triggers a fatal
            # error in a destructor
            a = RefCycle()
            b = RefCycle()
            a.b = b
            b.a = a

            # Delete the objects, not the cycle
            a = None
            b = None

            # Break the reference cycle: call __del__()
            gc.collect()

            # Should not reach this line
            print("exit", file=sys.stderr)
            	   ri   __del__T)rL   rK   rj   rf   s    r   test_gczFaultHandlerTests.test_gc   s*     	  8  #? 	 	%r   c                 2    | j                  dddddd       y )Nz
            import faulthandler
            faulthandler.enable()
            faulthandler._fatal_error_c_thread()
            rc   zin new threadFfaulthandler_fatal_error_threadT)rI   r\   rJ   rj   rf   s    r   test_fatal_error_c_threadz+FaultHandlerTests.test_fatal_error_c_thread   s+      
  %2 	 		!r   c                 *    | j                  ddd       y )Nzs
            import faulthandler
            faulthandler.enable()
            faulthandler._sigabrt()
            rc   Abortedrj   rf   s    r   test_sigabrtzFaultHandlerTests.test_sigabrt   s      
 	r   win32z"SIGFPE cannot be caught on Windowsc                 *    | j                  ddd       y )Nzr
            import faulthandler
            faulthandler.enable()
            faulthandler._sigfpe()
            rc   zFloating point exceptionrj   rf   s    r   test_sigfpezFaultHandlerTests.test_sigfpe   s     	  
 &	(r   zneed _testcapiSIGBUSzneed signal.SIGBUSc                 *    | j                  ddd       y )Nz
            import faulthandler
            import signal

            faulthandler.enable()
            signal.raise_signal(signal.SIGBUS)
               z	Bus errorrj   rf   s    r   test_sigbuszFaultHandlerTests.test_sigbus   s     	   	r   SIGILLzneed signal.SIGILLc                 *    | j                  ddd       y )Nz
            import faulthandler
            import signal

            faulthandler.enable()
            signal.raise_signal(signal.SIGILL)
            r|   zIllegal instructionrj   rf   s    r   test_sigillzFaultHandlerTests.test_sigill   s     	   !	#r   c                     t        j                         5  | j                  d| ddddd       d d d        y # 1 sw Y   y xY w)NzP
                import _testcapi
                _testcapi.fatal_error(b'xyz', )
                   xyz_testcapi_fatal_error_implT)r\   rJ   )r   r2   r^   )r>   release_gils     r   check_fatal_error_funcz(FaultHandlerTests.check_fatal_error_func  sX    ((* 	%"" (//:m <$ 1# # %	% 	% 	%s	   9Ac                 &    | j                  d       y )NFr   rf   s    r   test_fatal_errorz"FaultHandlerTests.test_fatal_error  s    ##E*r   c                 &    | j                  d       y )NTr   rf   s    r   test_fatal_error_without_gilz.FaultHandlerTests.test_fatal_error_without_gil  s    ##D)r   openbsdzVIssue #12868: sigaltstack() doesn't work on OpenBSD if Python is compiled with pthread_stack_overflowz#need faulthandler._stack_overflow()c                 .    | j                  dddd       y )Nzz
            import faulthandler
            faulthandler.enable()
            faulthandler._stack_overflow()
            rc   z (?:Segmentation fault|Bus error)z unable to raise a stack overflow)rH   rj   rf   s    r   test_stack_overflowz%FaultHandlerTests.test_stack_overflow  s'     	  
 .: 	 	<r   c                 *    | j                  ddd       y )Nzw
            import faulthandler
            faulthandler.enable()
            faulthandler._sigsegv(True)
            rc   ri   rj   rf   s    r   test_gil_releasedz#FaultHandlerTests.test_gil_released)  rl   r   z0sanitizer builds change crashing process output.)memoryubreasonc                     t               5 }| j                  dj                  t        |            dd|       d d d        y # 1 sw Y   y xY w)Nz
                import faulthandler
                output = open({filename}, 'wb')
                faulthandler.enable(output)
                faulthandler._sigsegv()
                r#      ri   )r%   r^   formatreprr>   r$   s     r   test_enable_filez"FaultHandlerTests.test_enable_file3  sT      ! 		#X"" $
 FDNF3$! # #		# 		# 		#s   /AAz.subprocess doesn't support pass_fds on Windowsc                     t        j                  d      5 }|j                         }| j                  d|z  dd|       d d d        y # 1 sw Y   y xY w)Nwb+z
                import faulthandler
                import sys
                faulthandler.enable(%s)
                faulthandler._sigsegv()
                r   ri   r@   )r    TemporaryFilefilenor^   )r>   rE   r@   s      r   test_enable_fdz FaultHandlerTests.test_enable_fdB  sa     ##E* 
	bB"" $
 $ $ # 
	 
	 
	s   )AAc                 .    | j                  dddd       y )Nz
            import faulthandler
            faulthandler.enable(all_threads=False)
            faulthandler._sigsegv()
            rc   ri   FrG   rj   rf   s    r   test_enable_single_threadz+FaultHandlerTests.test_enable_single_threadT  s%      
   	 	r   c                     d}d}| j                  |      \  }}dj                  |      }| j                  ||v|d|       | j                  |d       y )Nz
            import faulthandler
            faulthandler.enable()
            faulthandler.disable()
            faulthandler._sigsegv()
            zFatal Python errorr   z is present in r   )rF   rR   
assertTruerT   )r>   r?   not_expectedrC   rD   s        r   test_disablezFaultHandlerTests.test_disable_  s]     ,??406"F2.:FC	EHa(r   c                 h   d}| j                  |      \  }}dj                  |      }t        j                  d|t        j                        }|s| j                  d|       t        |j                  d      j                         j                  d            }dD ]  }| j                  ||        y )Nz
            import faulthandler
            import sys
            # Don't filter stdlib module names
            sys.stdlib_module_names = frozenset()
            faulthandler.enable()
            faulthandler._sigsegv()
            r   z*^Extension modules:(.*) \(total: [0-9]+\)$z$Cannot find 'Extension modules:' in r   z, )sysfaulthandler)rF   rR   research	MULTILINEfailsetgroupr0   splitassertIn)r>   r?   rC   rD   matchmodulesnames          r   test_dump_ext_modulesz'FaultHandlerTests.test_dump_ext_modulesn  s      ??406"		G ",,0II<VJGHekk!n**,22489+ 	)DMM$(	)r   c                 L   t         j                  }	 t         j                  t         _        t        j                         }	 t        j
                          | j                  t        j                                t        j                          | j                  t        j                                |rt        j
                          nt        j                          	 |t         _        y # |rt        j
                          w t        j                          w xY w# |t         _        w xY wr   )	r   rC   
__stderr__r   
is_enabledenabler   disableassertFalse)r>   orig_stderrwas_enableds      r   test_is_enabledz!FaultHandlerTests.test_is_enabled  s    jj	% CJ&113K	+##% 7 7 9:$$&  !8!8!:; '') ((*$CJ  '') ((*$CJs$   -D  A.C& .,D &-DD D#c                     d}t         j                  dd|f}t        j                  |      }| j	                  |j                         d       y )N5import faulthandler; print(faulthandler.is_enabled())-Er)      False)r   
executable
subprocesscheck_outputr7   rstrip)r>   r?   argsrB   s       r   test_disabled_by_defaultz*FaultHandlerTests.test_disabled_by_default  sB     GdD1((.(3r   c           	      N   d}t        d t        j                  t        j                  j                  rdndddd|f      }t
        j                  j                         }|j                  dd        t        j                  ||      }| j                  |j                         d	       y )
Nr   r   r-   z-Xr   r)   PYTHONFAULTHANDLERenv   True)filterr   r   flagsignore_environmentr:   environcopypopr   r   r7   r   r>   r?   r   r   rB   s        r   test_sys_xoptionsz#FaultHandlerTests.test_sys_xoptions  s     GdS^^%(YY%A%ATr!>4? @ jjoo$d+((37'2r   c                    d}t         j                  d|f}t        t        j                        }d|d<   d|d<   t        j                  ||      }| j                  |j                         d       t        t        j                        }d|d<   d|d<   t        j                  ||      }| j                  |j                         d	       y )
Nr   r)   r-   r   PYTHONDEVMODEr   r   1r   )	r   r   dictr:   r   r   r   r7   r   r   s        r   test_env_varzFaultHandlerTests.test_env_var  s     Gd+2::$& !!O((37(3 2::$' !!O((37'2r   rQ   c                    	 d}|j                  ||      }|rd}n|d}nd}dd|z  dd	g}| j                  |||      \  }}| j                  ||       | j                  |d
       y )Na[  
            import faulthandler

            filename = {filename!r}
            fd = {fd}

            def funcB():
                if filename:
                    with open(filename, "wb") as fp:
                        faulthandler.dump_traceback(fp, all_threads=False)
                elif fd is not None:
                    faulthandler.dump_traceback(fd,
                                                all_threads=False)
                else:
                    faulthandler.dump_traceback(all_threads=False)

            def funcA():
                funcB()

            funcA()
            rQ   rn         Stack (most recent call first):z#  File "<string>", line %s in funcBz#  File "<string>", line 17 in funcAz&  File "<string>", line 19 in <module>r   r   rF   r7   )r>   r$   r@   r?   rU   expectedtracerD   s           r   check_dump_tracebackz&FaultHandlerTests.check_dump_traceback  s    	* {{  
 F^FF-1F:14	
 //$"=x)1%r   c                 $    | j                          y r   )r   rf   s    r   test_dump_tracebackz%FaultHandlerTests.test_dump_traceback  s    !!#r   c                 f    t               5 }| j                  |       d d d        y # 1 sw Y   y xY wNr#   )r%   r   r   s     r   test_dump_traceback_filez*FaultHandlerTests.test_dump_traceback_file  s0    ! 	9X%%x%8	9 	9 	9   '0c                     t        j                  d      5 }| j                  |j                                d d d        y # 1 sw Y   y xY wNr   r   )r    r   r   r   r>   rE   s     r   test_dump_traceback_fdz(FaultHandlerTests.test_dump_traceback_fd  s@     ##E* 	6b%%%5	6 	6 	6   !A  A	c                     d}d|dz   z  }d|z  dz   }d}|j                  |      }dd|z  d	g}| j                  |      \  }}| j                  ||       | j                  |d
       y )Ni  x2   z...z
            import faulthandler

            def {func_name}():
                faulthandler.dump_traceback(all_threads=False)

            {func_name}()
            )	func_namer   z  File "<string>", line 4 in %sz%  File "<string>", line 6 in <module>r   r   )r>   maxlenr   	truncatedr?   r   r   rD   s           r   test_truncatezFaultHandlerTests.test_truncate  s    6B;'	&L5(	 {{  
 .-	93

 //$/x)1%r   c                 8   	 d}|j                  t        |            }| j                  ||      \  }}dj                  |      }|rd}nd}d}t	        |j                  |            j                         }| j                  ||       | j                  |d       y )	Na  
            import faulthandler
            from threading import Thread, Event
            import time

            def dump():
                if {filename}:
                    with open({filename}, "wb") as fp:
                        faulthandler.dump_traceback(fp, all_threads=True)
                else:
                    faulthandler.dump_traceback(all_threads=True)

            class Waiter(Thread):
                # avoid blocking if the main thread raises an exception.
                daemon = True

                def __init__(self):
                    Thread.__init__(self)
                    self.running = Event()
                    self.stop = Event()

                def run(self):
                    self.running.set()
                    self.stop.wait()

            waiter = Waiter()
            waiter.start()
            waiter.running.wait()
            dump()
            waiter.stop.set()
            waiter.join()
            r#   r      
   a  
            ^Thread 0x[0-9a-f]+ \(most recent call first\):
            (?:  File ".*threading.py", line [0-9]+ in [_a-z]+
            ){{1,3}}  File "<string>", line 23 in run
              File ".*threading.py", line [0-9]+ in _bootstrap_inner
              File ".*threading.py", line [0-9]+ in _bootstrap

            Current thread 0x[0-9a-f]+ \(most recent call first\):
              File "<string>", line {lineno} in dump
              File "<string>", line 28 in <module>$
            )rU   r   )r   r   rF   rR   r	   r0   rS   r7   )r>   r$   r?   rB   rD   rU   r   s          r   check_dump_traceback_threadsz.FaultHandlerTests.check_dump_traceback_threads  s    	@ {{DN{3??4:6"FF
 u||6|2399;'1%r   c                 &    | j                  d        y r   )r   rf   s    r   test_dump_traceback_threadsz-FaultHandlerTests.test_dump_traceback_threadsO  s    ))$/r   c                 d    t               5 }| j                  |       d d d        y # 1 sw Y   y xY wr   )r%   r   r   s     r    test_dump_traceback_threads_filez2FaultHandlerTests.test_dump_traceback_threads_fileR  s-    ! 	8X--h7	8 	8 	8s   &/c                ~   	 t        t        j                  t                    }d}|j	                  t        |||||      }| j                  ||      \  }}	dj                  |      }|s0|}
|r|
dz  }
d|z  }t        dd||
	      }| j                  ||       n| j                  |d
       | j                  |	d       y )N)secondsa  
            import faulthandler
            import time
            import sys

            timeout = {timeout}
            repeat = {repeat}
            cancel = {cancel}
            loops = {loops}
            filename = {filename!r}
            fd = {fd}

            def func(timeout, repeat, cancel, file, loops):
                for loop in range(loops):
                    faulthandler.dump_traceback_later(timeout, repeat=repeat, file=file)
                    if cancel:
                        faulthandler.cancel_dump_traceback_later()
                    time.sleep(timeout * 5)
                    faulthandler.cancel_dump_traceback_later()

            if filename:
                file = open(filename, "wb")
            elif fd is not None:
                file = sys.stderr.fileno()
            else:
                file = None
            func(timeout, repeat, cancel, file, loops)
            if filename:
                file.close()
            )timeoutrepeatcancelloopsr$   r@   r   r   zATimeout \(%s\)!\nThread 0x[0-9a-f]+ \(most recent call first\):\n      )r   r-   r   )
strdatetime	timedeltaTIMEOUTr   rF   rR   r   rS   r7   )r>   r  r  r  r$   r@   timeout_strr?   r   rD   countr   r   s                r   check_dump_traceback_laterz,FaultHandlerTests.check_dump_traceback_laterV  s    	 (,,W=>< {{  
 //$9x		% E
Y\ggF&r2vGEUE*UB'1%r   c                 $    | j                          y r   r  rf   s    r   test_dump_traceback_laterz+FaultHandlerTests.test_dump_traceback_later  s    '')r   c                 (    | j                  d       y )NT)r  r  rf   s    r    test_dump_traceback_later_repeatz2FaultHandlerTests.test_dump_traceback_later_repeat      ''t'4r   c                 (    | j                  d       y )NT)r  r  rf   s    r    test_dump_traceback_later_cancelz2FaultHandlerTests.test_dump_traceback_later_cancel  r  r   c                 f    t               5 }| j                  |       d d d        y # 1 sw Y   y xY wr   )r%   r  r   s     r   test_dump_traceback_later_filez0FaultHandlerTests.test_dump_traceback_later_file  s0    ! 	?X++X+>	? 	? 	?r   c                     t        j                  d      5 }| j                  |j                                d d d        y # 1 sw Y   y xY wr   )r    r   r  r   r   s     r   test_dump_traceback_later_fdz.FaultHandlerTests.test_dump_traceback_later_fd  s@     ##E* 	<b++ryy{+;	< 	< 	<r   walltimec                 (    | j                  d       y )Nr   )r  r  rf   s    r   test_dump_traceback_later_twicez1FaultHandlerTests.test_dump_traceback_later_twice  s    ''a'0r   registerzneed faulthandler.registerc                 h   	 t         j                  }d}|j                  ||||||      }| j                  ||      \  }}	dj	                  |      }|s'|rd}
nd}
t        dd|
      }
| j                  ||
       n| j                  |d       |r| j                  |	d	       y | j                  |	d	       y )
Naz  
            import faulthandler
            import os
            import signal
            import sys

            all_threads = {all_threads}
            signum = {signum:d}
            unregister = {unregister}
            chain = {chain}
            filename = {filename!r}
            fd = {fd}

            def func(signum):
                os.kill(os.getpid(), signum)

            def handler(signum, frame):
                handler.called = True
            handler.called = False

            if filename:
                file = open(filename, "wb")
            elif fd is not None:
                file = sys.stderr.fileno()
            else:
                file = None
            if chain:
                signal.signal(signum, handler)
            faulthandler.register(signum, file=file,
                                  all_threads=all_threads, chain={chain})
            if unregister:
                faulthandler.unregister(signum)
            func(signum)
            if chain and not handler.called:
                if file is not None:
                    output = file
                else:
                    output = sys.stderr
                print("Error: signal handler not called!", file=output)
                exitcode = 1
            else:
                exitcode = 0
            if filename:
                file.close()
            sys.exit(exitcode)
            )rG   signum
unregisterchainr$   r@   r   z8Current thread 0x[0-9a-f]+ \(most recent call first\):\nz#Stack \(most recent call first\):\nr       r-   r   )	signalSIGUSR1r   rF   rR   r   rS   r7   rT   )r>   r$   rG   r   r!  r@   r  r?   r   rD   r   s              r   check_registerz FaultHandlerTests.check_register  s    	 -\ {{#!  
 //$9x		% S>&r2u5EUE*UB'!,Xq)r   c                 $    | j                          y r   r%  rf   s    r   test_registerzFaultHandlerTests.test_register  s    r   c                 (    | j                  d       y )NT)r   r'  rf   s    r   test_unregisterz!FaultHandlerTests.test_unregister  s    t,r   c                 f    t               5 }| j                  |       d d d        y # 1 sw Y   y xY wr   )r%   r%  r   s     r   test_register_filez$FaultHandlerTests.test_register_file  s0    ! 	3X2	3 	3 	3r   c                     t        j                  d      5 }| j                  |j                                d d d        y # 1 sw Y   y xY wr   )r    r   r%  r   r   s     r   test_register_fdz"FaultHandlerTests.test_register_fd  s@     ##E* 	0b299;/	0 	0 	0r   c                 (    | j                  d       y )NTr   r'  rf   s    r   test_register_threadsz'FaultHandlerTests.test_register_threads  s    -r   c                 (    | j                  d       y )NT)r!  r'  rf   s    r   test_register_chainz%FaultHandlerTests.test_register_chain  s    $'r   c              #      K   t         j                  }	 d t         _        | j                  t              5 }d  d d d        | j	                  t        j                        d       |t         _        y # 1 sw Y   :xY w# |t         _        w xY ww)Nzsys.stderr is None)r   rC   assertRaisesRuntimeErrorr7   r  	exception)r>   rC   cms      r   check_stderr_nonez#FaultHandlerTests.check_stderr_none  sm     	 CJ""<0 BS.0DECJ	   CJs2   B A> A2-A> &B2A;7A> >BBc                    | j                         5  t        j                          d d d        | j                         5  t        j                          d d d        | j                         5  t        j                  d       d d d        t        t        d      r=| j                         5  t        j                  t        j                         d d d        y y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   oxY w# 1 sw Y   y xY w)NgMbP?r  )	r8  r   r   dump_tracebackdump_traceback_laterhasattrr  r#  r$  rf   s    r   test_stderr_Nonez"FaultHandlerTests.test_stderr_None  s     ##% 	"!	"##% 	*'')	*##% 	4--d3	4<,'') 6%%fnn56 6 -	" 	"	* 	*	4 	46 6s.   CC#+C/)$C;C #C,/C8;Dzspecific to Windowsc                 F    dD ]  \  }}| j                  d| dd|        y )N))EXCEPTION_ACCESS_VIOLATIONrd   )EXCEPTION_INT_DIVIDE_BY_ZEROzint divide by zero)EXCEPTION_STACK_OVERFLOWzstack overflowz
                import faulthandler
                faulthandler.enable()
                faulthandler._raise_exception(faulthandler._r   rc   )r`   )r>   excr   s      r   test_raise_exceptionz&FaultHandlerTests.test_raise_exception,  sG    
 	IC
 (( .= >AE B*
 	r   c                     dD ]K  }d| d}t        |      }| j                  |      \  }}| j                  |g        | j                  ||       M y )N)l   cs@ l   RC@ z
                    import faulthandler
                    faulthandler.enable()
                    faulthandler._raise_exception(z)
                    r	   rF   r7   )r>   exc_coder?   rB   rD   s        r   test_ignore_exceptionz'FaultHandlerTests.test_ignore_exception;  si    
 	1H3 4<* =D
 $<D#t4FHVR(Xx0	1r   c                     dD ]D  }| j                  d|dd      \  }}| j                  |g        | j                  |||dz  f       F y )N)r   ixV4i   @i  @i   piz{
                import faulthandler
                faulthandler.enable()
                faulthandler._raise_exception(0xr   r   i)rF   r7   r   )r>   rB  rB   rD   s       r   test_raise_nonfatal_exceptionz/FaultHandlerTests.test_raise_nonfatal_exceptionK  so    
 	4C  $ 41 25Q 80  FH VR( MM(k 124#	4r   c                     t        d      }| j                  |      \  }}| j                  |g        | j                  |d       y )Nz
            import faulthandler
            faulthandler.enable()
            faulthandler.disable()
            code = faulthandler._EXCEPTION_ACCESS_VIOLATION
            faulthandler._raise_exception(code)
        l       rE  r>   r?   rB   rD   s       r    test_disable_windows_exc_handlerz2FaultHandlerTests.test_disable_windows_exc_handlerg  sF        ??40$:.r   c                     t        d      }| j                  |      \  }}| j                  |g        | j                  |d       y )Nz`
            import faulthandler
            faulthandler.cancel_dump_traceback_later()
        r   rE  rK  s       r   .test_cancel_later_without_dump_traceback_laterz@FaultHandlerTests.test_cancel_later_without_dump_traceback_latert  sH         ??40$1%r   )NNr   )FFr   )FFFFN)K__name__
__module____qualname__rF   rW   r^   r`   r   r   r   platform
startswithrg   r   rk   rp   rs   rv   ry   	_testcapi
skipUnlessr<  r#  r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   requires_subprocessr   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  requires_resourcer  r%  r(  r*  r,  r.  r0  r2  r   r8  r=  re   rC  rG  rI  rL  rN  r   r   r   r'   r'   3   s   -D "t#(','%)N?? X__S\\,,U3LN$N$* " " !% !%F
! X__S\\W,9;(;( X__Y$&(89X24HI	  J :	 X__Y$&(89X24HI	#  J :	#
%+* X__S\\,,Y7BC X__/@AA:<<<C
< " " dt 5@ A
# A
# X__S\\W,EGdt 5@ A AG
   ) ) ) )&%, !W  "4 #4 !W  "
3 #
3 !W  "3 #3$ 04 ,&\$9 X__S\\W,EG6G6&09&v08<&/3<&|*55? X__S\\W,EG<G< Wz*1 +1 X__z::139>9=O*3O*b-3 X__S\\W,EG0G0.(    6 X%:; < X%:;1 <1 X%:;4 <46 X%:;
/ <
/	&r   r'   __main__)r   )"
contextlibr   r  r   r:   r   r#  r   r   r   r   test.supportr   r   r   r   r    r   textwrapr	   rT  ImportErrorhas_subprocess_supportSkipTestr
  r   re   r   r   r%   TestCaser'   rO  mainr   r   r   <module>ra     s    %   	 	   
  " 2 *    %%
(

=
>>
ggo
!M
 # #J&)) J&Z zHMMO [  Is   B; ;CC