a  zelF@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddlmZejddZe eeddGd d d e jZe eeddGd d d eZe eeddGd ddeZe eeddGdddeZe eedde eeddGdddeZe eeddGdddeZGdddeZedkre dS)a This test suite exercises some system calls subject to interruption with EINTR, to check that it is actually handled transparently. It is intended to be run by the main test suite within a child process, to ensure there is no background thread running (so that signals are delivered to the correct thread). Signals are generated in-process using setitimer(ITIMER_REAL), which allows sub-second periodicity (contrarily to signal()). N)support) socket_helperccsJ|2z |VWn|Yn0Wdn1s<0YdS)zGContext manager killing the subprocess if a Python exception is raised.N)kill)procrO/opt/bitninja-python-dojo/embedded/lib/python3.9/test/eintrdata/eintr_tester.py kill_on_errors  r setitimerzrequires setitimer()c@sHeZdZdZdZdZdZddZddZe dd Z d d Z d d Z dS) EINTRBaseTestz Base class for EINTR tests. g?g?cCs|jd7_dSN)signals)selfsignumframerrr sighandler2szEINTRBaseTest.sighandlercCsBd|_ttj|j|_ttj|j|jt j ddt j ddS)NriXT)exitfile) r signalSIGALRMr orig_handlerr ITIMER_REAL signal_delay signal_period faulthandlerZdump_traceback_latersys __stderr__rrrrsetUp5s zEINTRBaseTest.setUpcCsttjdddSNr)rr rrrrr stop_alarm@szEINTRBaseTest.stop_alarmcCs$|ttj|jtdSN)r rrrrZcancel_dump_traceback_laterrrrrtearDownDszEINTRBaseTest.tearDowncOs tjdf|}tj|fi|S)Nz-c)r executable subprocessPopen)rargskwZcmd_argsrrrr$IszEINTRBaseTest.subprocessN) __name__ __module__ __qualname____doc__rr sleep_timerr staticmethodr r"r$rrrrr &s  r c@s|eZdZdZddZddZddZee e dd d d Z d d Z ddZ ee e ddddZddZddZdS) OSEINTRTestz EINTR tests for the os module. cCsd|j}||S)Nzimport time; time.sleep(%r))r,r$)rcoderrrnew_sleep_processRs zOSEINTRTest.new_sleep_processcsDd}fddt|D}t|D] }|q"|D] }|q2dS)Ncsg|] }qSr)r0).0_rrr Xz3OSEINTRTest._test_wait_multiple..)rangewait)r wait_funcnum processesr3rrrr_test_wait_multipleVs  zOSEINTRTest._test_wait_multiplecCs|tjdSr!)r;osr7rrrr test_wait_szOSEINTRTest.test_waitwait3zrequires wait3()cCs|dddS)NcSs tdSr)r<r>rrrrdr5z(OSEINTRTest.test_wait3..)r;rrrr test_wait3bszOSEINTRTest.test_wait3cCs|}||j|dSr!)r0pidr7)rr8rrrr_test_wait_singlefs zOSEINTRTest._test_wait_singlecCs|dddS)NcSs t|dSr)r<waitpidrArrrr?mr5z*OSEINTRTest.test_waitpid..rBrrrr test_waitpidlszOSEINTRTest.test_waitpidwait4zrequires wait4()cCs|dddS)NcSs t|dSr)r<rGrDrrrr?qr5z(OSEINTRTest.test_wait4..rErrrr test_wait4oszOSEINTRTest.test_wait4c Cst\}}|tj|gd}ddddd|d|jddd d d f }|j|t||gd }t|Lt||D]}| |t |t |qx| | d Wdn1s0YdS)N)shellosworldsspam zimport os, sys, timezwr = int(sys.argv[1]) datas = %rsleep_time = %rzfor data in datas:z$ # let the parent block on read() time.sleep(sleep_time)z os.write(wr, data)pass_fdsr) r<pipe addCleanupclosejoinr,r$strr assertEqualreadlenr7)rrdwrdatasr/rdatarrr test_readss*    zOSEINTRTest.test_readcCst\}}|tj|dtj}ddddd|jdtjddd d dd d d ddddddf}|j|t ||gd}t |Xt|d}|t |kr|t |t ||d7}q||dWdn1s0YdS)NxrIzimport io, os, sys, timerJzrd = int(sys.argv[1])rLzdata = b"x" * %sdata_len = len(data)z!# let the parent block on write()time.sleep(sleep_time)zread_data = io.BytesIO()z+while len(read_data.getvalue()) < data_len:z% chunk = os.read(rd, 2 * data_len)z read_data.write(chunk)zvalue = read_data.getvalue()zif value != data:z0 raise Exception("read error: %s vs %s bytes"z- % (len(value), data_len))rNr)r<rPrQrRrZ PIPE_MAX_SIZErSr,r$rTrrWwrite memoryviewrUr7)rrXrYr[r/rwrittenrrr test_writes>     zOSEINTRTest.test_writeN)r(r)r*r+r0r;r=unittest skipUnlesshasattrr<r@rBrFrHr\rcrrrrr.Ns   r.c@seZdZdZeeeddddZddZ eeejdd d d Z d d Z ddZ ddZ eeejddddZddZeddeeeddddZddZeejd kd!d"d#Zd$d%Zeejd kd!d&d'Zd(S))SocketEINTRTestz$ EINTR tests for the socket module. socketpairzneeds socketpair()c Cst\}}||jgd}dddddt|jdt|jd|d |jdd d dd d dddf}| }|j |t ||gd}t |H||D]}| |||t|q| |dWdn1s0YdS)N)r]yzrIimport os, socket, sys, timerJfd = int(sys.argv[1]) family = %ssock_type = %srKrLz)wr = socket.fromfd(fd, family, sock_type) os.close(fd)zwith wr:z for data in datas:z( # let the parent block on recv()z time.sleep(sleep_time)z wr.sendall(data)rNr)socketrhrQrRrSintfamilytyper,filenor$rTrrUrWr7) rZ recv_funcrXrYrZr/fdrr[rrr _test_recvs8     zSocketEINTRTest._test_recvcCs|tjjdSr!)rvrprecvrrrr test_recvszSocketEINTRTest.test_recvrecvmsgzneeds recvmsg()cCs|dddS)NcSs||dSr)rysockr[rrrr?r5z.SocketEINTRTest.test_recvmsg..)rvrrrr test_recvmsgszSocketEINTRTest.test_recvmsgc Cs(t\}}||jdtjd}dddddt|jdt|j d |j d tjdd dd d dddddddddddddf}| }|j |t ||gd}t|h|d}|t|kr||t||d} || durt|n| 7}q||dWdn1s0YdS)Nsxyzr1rIrkrJrlrmrnrLzdata = b"xyz" * %sr^z)rd = socket.fromfd(fd, family, sock_type)rozwith rd:z$ # let the parent block on send()rMz' received_data = bytearray(data_len)z n = 0z while n < data_len:z8 n += rd.recv_into(memoryview(received_data)[n:])zif received_data != data:z0 raise Exception("recv error: %s vs %s bytes"z5 % (len(received_data), data_len))rNr)rprhrQrRrZ SOCK_MAX_SIZErSrqrrrsr,rtr$rTrrWrarUr7) rZ send_funcrXrYr[r/rurrbsentrrr _test_sendsL       zSocketEINTRTest._test_sendcCs|tjjdSr!)r~rpsendrrrr test_sendszSocketEINTRTest.test_sendcCs|tjjdSr!)r~rpsendallrrrr test_sendallszSocketEINTRTest.test_sendallsendmsgzneeds sendmsg()cCs|dddS)NcSs ||gSr!)rrzrrrr?r5z.SocketEINTRTest.test_sendmsg..)r~rrrr test_sendmsgszSocketEINTRTest.test_sendmsgc Csttjdf}||j|d}ddddtjd|d|jdd d d d f }| |}t |4| \}}|| | dWdn1s0YdS) Nrr rIzimport socket, timerJz host = %rz port = %srLz# let parent block on accept()r_z,with socket.create_connection((host, port)):rM)rp create_serverrZHOSTrQrR getsocknamerSr,r$racceptrUr7)rr{portr/rZ client_sockr3rrr test_accepts(     zSocketEINTRTest.test_accept r1mkfifozneeds mkfifo()c Cstj}t|zt|Wn2tyP}z|d|WYd}~n d}~00|tj|dddd|d|j dddd|f }| |}t |(||| | d Wdn1s0YdS) Nzos.mkfifo(): %srIimport os, timerJz path = %arLz# let the parent blockr_r)rTESTFNunlinkr<rPermissionErrorZskipTestrQrSr,r$rrUr7)rZdo_open_close_readerZdo_open_close_writerfilenameer/rrrr _test_open:s, $  zSocketEINTRTest._test_opencCst|d}|dS)Nw)openrR)rpathfprrr python_openYs zSocketEINTRTest.python_opendarwinz+hangs under macOS; see bpo-25234, bpo-35363cCs|d|jdS)Nzfp = open(path, 'r') fp.close())rrrrrr test_open]szSocketEINTRTest.test_opencCst|tj}t|dSr!)r<rO_WRONLYrR)rrrurrros_opencszSocketEINTRTest.os_opencCs|d|jdS)Nz,fd = os.open(path, os.O_RDONLY) os.close(fd))rrrrrr test_os_opengszSocketEINTRTest.test_os_openN)r(r)r*r+rdrerfrprvrxr|r~rrrrrZrequires_freebsd_versionr<rrskipIfrplatformrrrrrrrrgs2 # .      rgc@seZdZdZddZdS) TimeEINTRTestz" EINTR tests for the time module. cCs:t}t|j|t|}|||jdSr!)time monotonicsleepr,r assertGreaterEqualrt0dtrrr test_sleeprs   zTimeEINTRTest.test_sleepN)r(r)r*r+rrrrrrnsrpthread_sigmaskzneed signal.pthread_sigmask()c@sLeZdZdZddZeeeddddZ eeeddd d Z d S) SignalEINTRTestz$ EINTR tests for the signal module. c Cstj}t}t|dd}|tj||dddtdt|d|jdd f}ttj |g}|tjtj |gt }| |}t|$||t |} Wdn1s0Y||d dS) NcWsdSr!r)r&rrrr?r5z/SignalEINTRTest.check_sigwait..rIrzpid = %sz signum = %srLr_zos.kill(pid, signum)r)rSIGUSR1r<getpidrQrSrqr,r SIG_BLOCK SIG_UNBLOCKrrr$rrUr7) rr8rrAZ old_handlerr/Zold_maskrrrrrr check_sigwaits(     *zSignalEINTRTest.check_sigwait sigwaitinfozneed signal.sigwaitinfo()cCsdd}||dS)NcSst|gdSr!)rrrrrrr8sz3SignalEINTRTest.test_sigwaitinfo..wait_funcrrr8rrrtest_sigwaitinfosz SignalEINTRTest.test_sigwaitinfo sigtimedwaitcCsdd}||dS)NcSst|gddS)Ng^@)rrrrrrr8sz4SignalEINTRTest.test_sigtimedwait..wait_funcrrrrrtest_sigtimedwaitsz!SignalEINTRTest.test_sigtimedwaitN) r(r)r*r+rrdrerfrrrrrrrrzs   rc@seZdZdZddZeejdkde e e dddd Z e e e d d d d Z e e e ddddZe e e ddddZdS)SelectEINTRTestz$ EINTR tests for the select module. cCs@t}tggg|jt|}||||jdSr!)rrselectr,r rrrrr test_selects  zSelectEINTRTest.test_selectrz(poll may fail on macOS; see issue #28087pollzneed select.pollcCsFt}t}||jdt|}||||jdSNg@@)rrrrr,r rrZpollerrrrrr test_polls  zSelectEINTRTest.test_pollepollzneed select.epollcCsNt}||jt}||jt|}|| ||jdSr!) rrrQrRrrrr,r rrrrr test_epolls   zSelectEINTRTest.test_epollkqueuezneed select.kqueuecCsRt}||jt}|dd|jt|}|| ||jdSr ) rrrQrRrrZcontrolr,r r)rrrrrrr test_kqueues  zSelectEINTRTest.test_kqueuedevpollzneed select.devpollcCsRt}||jt}||jdt|}|| ||jdSr) rrrQrRrrrr,r rrrrr test_devpolls  zSelectEINTRTest.test_devpollN)r(r)r*r+rrdrrrrerfrrrrrrrrrrs    rc@s8eZdZddZeedkdddZddZ d S) FNTLEINTRTestc Cs<|tjtjdddtjd|d|jf}t}||}t |t tjd}t|}|dkr|t d|z,||t j t jB||t jtd Wq\tyYqYq\0q\||t j t|}|||j|Wdn1s0Y|Wdn1s.0YdS) NrIzimport fcntl, timezwith open('%s', 'wb') as f:z fcntl.%s(f, fcntl.LOCK_EX)z time.sleep(%s)wbgN@z failed to sync child in %.1f secg{Gz?)rQrrrrSr,rrr$rr ExceptionfcntlZLOCK_EXZLOCK_NBZLOCK_UNrBlockingIOErrorrr r7)rZ lock_funcZ lock_namer/Z start_timerfrrrr_locks2         (zFNTLEINTRTest._lockZAIXzAIX returns PermissionErrorcCs|tjddS)Nlockf)rrrrrrr test_lockfszFNTLEINTRTest.test_lockfcCs|tjddS)Nflock)rrrrrrr test_flock szFNTLEINTRTest.test_flockN) r(r)r*rrdrrsystemrrrrrrrs  r__main__)r+ contextlibrrr<rrrrpr$rrrdtestrZ test.supportrcontextmanagerrrerfZTestCaser r.rgrrrrr(mainrrrrsF    'h7  /8)