a 5êdg—bã@s”ddlZddlmZddlmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZz ddlZWneyîdZYn0z ddlZWneydZYn0z ddlZWney:dZYn0ejrNe d¡‚ej dkZ!e!rddZ"ndZ"d Z#e$e%e&fZ'ej(d d fa)d d „Z*Gdd„dej+ƒZ,Gdd„de-ƒZ.Gdd„dej/ƒZ0Gdd„de,ƒZ1Gdd„de,ƒZ2dd„Z3e 4e!d¡Gdd„de,ƒƒZ5e 6e!d¡Gdd„de,ƒƒZ7Gd d!„d!ej+ƒZ8e 6e9ed"ƒd#¡Gd$d%„d%e1ƒƒZ:e 6e!d&¡Gd'd(„d(e,ƒƒZ;Gd)d*„d*e,ƒZ¡dS),éN)Úmock)Úsupport)ÚFakePathztest is not helpful for PGOÚwin32z@import msvcrt; msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY);Ú)Znonexisting_i_hopeú-cÚpasscCs@t d¡}|durdSt |tj¡rs ÿrc@seZdZdd„Zdd„ZdS)Ú BaseTestCasecCs t ¡dS©N)rÚ reap_children©ÚselfrrrÚsetUpIszBaseTestCase.setUpcCsBts.tjD] }| ¡q t ¡| tjd¡| ¡t ¡dS)Nzsubprocess._active not empty) Ú mswindowsrÚ_activeÚwaitÚ_cleanupÚ assertFalseZ doCleanupsrr)rÚinstrrrÚtearDownNs  ÿzBaseTestCase.tearDownN©Ú__name__Ú __module__Ú __qualname__rr"rrrrrHsrc@s eZdZdS)ÚPopenTestExceptionN)r$r%r&rrrrr'[sr'c@seZdZdZdd„ZdS)ÚPopenExecuteChildRaiseszePopen subclass for testing cleanup of subprocess.PIPE filehandles when _execute_child fails. cOs tdƒ‚dS)NzForced Exception for Test)r'©rÚargsÚkwargsrrrÚ_execute_childcsz&PopenExecuteChildRaises._execute_childN)r$r%r&Ú__doc__r,rrrrr(_sr(c@sBeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Ze e d7¡d8d9„ƒZ!e e d7¡d:d;„ƒZ"e e d7¡dd?„Z$d@dA„Z%dBdC„Z&dDdE„Z'dFdG„Z(dHdI„Z)e e dJ¡dKdL„ƒZ*e e dJ¡dMdN„ƒZ+dOdP„Z,e e-j.e-j/kdQ¡dRdS„ƒZ0e e-j.e-j/kdQ¡e e1 2¡dT¡dUdV„ƒƒZ3dWdX„Z4dYdZ„Z5d[d\„Z6d]d^„Z7d_d`„Z8dadb„Z9dcdd„Z:dedf„Z;dgdh„Zdmdn„Z?dodp„Z@dqdr„ZAdsdt„ZBdudv„ZCdwdx„ZDe e-jEdykdz¡e e1 Fd{¡d|kd}¡d~d„ƒƒZGd€d„ZHd‚dƒ„ZId„d…„ZJd†d‡„ZKdˆd‰„ZLdŠd‹„ZMdŒd„ZNdŽd„ZOdd‘„ZPd’d“„ZQd”d•„ZRd–d—„ZSd˜d™„ZTdšd›„ZUdœd„ZVdždŸ„ZWd d¡„ZXd¢d£„ZYd¤d¥„ZZd¦d§„Z[d¨d©„Z\dªd«„Z]d¬d­„Z^d®d¯„Z_d°d±„Z`d²d³„Zad´dµ„Zbd¶d·„Zcd¸d¹„Zddºd»„Zed¼d½„Zfd¾d¿„ZgdÀdÁ„ZhdÂdÄZidÄdÅ„ZjdÆdÇ„ZkdÈdÉ„ZldÊdË„Zme neoepd̃dÍ¡e neoeqd΃dÏ¡e neoeqdЃdÑ¡dÒdÓ„ƒƒƒZre neqjs tdÔeq u¡¡dÕ¡dÖdׄƒZve e dØ¡dÙdÚ„ƒZwe e dØ¡dÛdÜ„ƒZxdÝdÞ„ZydßS)àÚProcessTestCasecCs tjttjtjtjd}zZ| |jtj¡| |jtj¡| |j tj¡W|j  ¡|j  ¡|j   ¡|  ¡n(|j  ¡|j  ¡|j   ¡|  ¡0dS)N©ÚstdinÚstdoutÚstderr) rÚPopenrÚPIPEÚassertIsInstancer0ÚioÚBufferedIOBaser1r2Úcloser©rÚprrrÚtest_io_buffered_by_defaultis þ    ý   z+ProcessTestCase.test_io_buffered_by_defaultcCs¢tjttjtjtjdd}zZ| |jtj¡| |jtj¡| |j tj¡W|j  ¡|j  ¡|j   ¡|  ¡n(|j  ¡|j  ¡|j   ¡|  ¡0dS)Nr)r0r1r2Úbufsize) rr3rr4r5r0r6Ú RawIOBaser1r2r8rr9rrrÚtest_io_unbuffered_worksws þ    ý   z(ProcessTestCase.test_io_unbuffered_workscCs"t tjddg¡}| |d¡dS©Nrúimport sys; sys.exit(47)é/©rÚcallÚsysÚ executableÚ assertEqual©rÚrcrrrÚ test_call_seq…s ÿzProcessTestCase.test_call_seqcCs"|jtjtjtjddgdddS)Nrúwhile True: passçš™™™™™¹?©Útimeout)Ú assertRaisesrÚTimeoutExpiredrCrDrErrrrÚtest_call_timeout‹s  þz!ProcessTestCase.test_call_timeoutcCst t¡}| |d¡dS©Nr)rÚ check_callrrFrGrrrÚtest_check_call_zero”s z$ProcessTestCase.test_check_call_zerocCsR| tj¡"}t tjddg¡Wdƒn1s40Y| |jjd¡dSr?) rNrÚCalledProcessErrorrRrDrErFÚ exceptionr©rÚcrrrÚtest_check_call_nonzero™s  ÿ$z'ProcessTestCase.test_check_call_nonzerocCs"t tjddg¡}| d|¡dS)Nrú print('BDFL')óBDFL©rÚ check_outputrDrEÚassertIn©rÚoutputrrrÚtest_check_output s ÿz!ProcessTestCase.test_check_outputcCsR| tj¡"}t tjddg¡Wdƒn1s40Y| |jjd¡dS)Nrzimport sys; sys.exit(5)é) rNrrTr\rDrErFrUrrVrrrÚtest_check_output_nonzero¦s  ÿ"z)ProcessTestCase.test_check_output_nonzerocCs(tjtjddgtjd}| d|¡dS)Nrú$import sys; sys.stderr.write('BDFL')©r2rZ)rr\rDrEÚSTDOUTr]r^rrrÚtest_check_output_stderr­s  þz(ProcessTestCase.test_check_output_stderrcCsNt ¡}| |j¡| d¡| d¡tjtj ddg|d}|  d|¡dS)Nópearrrú6import sys; sys.stdout.write(sys.stdin.read().upper())©r0óPEAR) ÚtempfileÚ TemporaryFileÚ addCleanupr8ÚwriteÚseekrr\rDrEr])rÚtfr_rrrÚtest_check_output_stdin_arg´s   ÿýz+ProcessTestCase.test_check_output_stdin_argcCs&tjtjddgdd}| d|¡dS)Nrrhrg©Úinputrjr[r^rrrÚtest_check_output_input_argÀsÿýz+ProcessTestCase.test_check_output_input_argcCs&tjtjddgdd}| d|¡dS)z.is_env_var_to_ignorerz)import os; print(list(os.environ.keys()))rcsg|]}ˆ|ƒs|‘qSrr)Ú.0Úk©r rrÚ Ðsÿz2ProcessTestCase.test_empty_env..N) rr3rDrEr4r ÚevalÚstripr5ÚlistrF)rr:r1r2Zchild_env_namesrrrÚtest_empty_env¹s ÿþ   zProcessTestCase.test_empty_envcCs„tjd}| t¡ t |ddg¡Wdƒn1s:0Y| t¡"t tjddg¡Wdƒn1sv0YdS)Núrrzpass#)rDrErNr€rr3)rÚcmdrrrÚtest_invalid_cmdÔs   . z ProcessTestCase.test_invalid_cmdcCsHtj ¡}d|d<| t¡tjt|dWdƒn1s@0Ytj ¡}d|d<| t¡tjt|dWdƒn1sŠ0Ytj ¡}d|d<| t¡tjt|dWdƒn1sÔ0Ytj ¡}d|d<tjtj d d gtj |d (}|  ¡\}}|  |d ¡Wdƒn1s:0YdS) NZcabbagezFRUITVEGETABLErŽzorangeVEGETABLE=cabbagerZlemonz FRUIT=ORANGEz orange=lemonrz3import sys, os;sys.stdout.write(os.getenv("FRUIT"))rs orange=lemon) r r‘r’rNr€rr3rrDrEr4r rFrrrrÚtest_invalid_envÞs.  ,  ,  ,  ÿü z ProcessTestCase.test_invalid_envcCs4tjtjddgtjd}| d¡| |jd¡dS)Nrz/import sys;sys.exit(sys.stdin.read() == "pear")rirgrrør9rrrÚtest_communicate_stdinüs ÿý z&ProcessTestCase.test_communicate_stdincCs@tjtjddgtjd}| ¡\}}| |d¡| |d¡dS)Nrz)import sys; sys.stdout.write("pineapple")ró pineapple©rr3rDrEr4r rFrùrrrÚtest_communicate_stdouts ÿþ  z'ProcessTestCase.test_communicate_stdoutcCs@tjtjddgtjd}| ¡\}}| |d¡| |d¡dS)Nrz)import sys; sys.stderr.write("pineapple")rdrrrùrrrÚtest_communicate_stderr s ÿþ  z'ProcessTestCase.test_communicate_stderrcCsttjtjddgtjtjtjd}| |jj¡| |jj¡| |j j¡|  d¡\}}|  |d¡|  |d¡dS)NrzNimport sys,os;sys.stderr.write("pineapple");sys.stdout.write(sys.stdin.read())r/óbananar) rr3rDrEr4rmr1r8r2r0r rFrùrrrÚtest_communicates ÿú z ProcessTestCase.test_communicatecCsdtjtjddgdtjtjtjd}|jtj|jddd| ¡\}}| |d¡| |  ¡d¡dS) Nrz~import sys,os,time;sys.stderr.write("pineapple\n");time.sleep(1);sys.stderr.write("pear\n");sys.stdout.write(sys.stdin.read())T)r|r0r1r2rŒg333333Ó?rLspineapple pear ) rr3rDrEr4rNrOr rFÚencoderùrrrÚtest_communicate_timeout#s ÿ÷ ÿ  z(ProcessTestCase.test_communicate_timeoutcCsLtjtjddgtjd}|jtj|jdd| ¡\}}| t |ƒd¡dS)NrzÓimport sys,os,time;sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));rgš™™™™™Ù?rLi) rr3rDrEr4rNrOr rFÚlen)rr:r1Ú_rrrÚ%test_communicate_timeout_large_output6s ÿ ÷  z5ProcessTestCase.test_communicate_timeout_large_outputcCs¸dD]®}dD]¤}dD]š}i}|r*tj|d<|r8tj|d<|rFtj|d<|sLqtjtfi|¤Ž}| ¡|jdur~| |jj¡|jdur–| |jj¡|j dur| |j j¡qq qdS)N©FTr0r1r2) rr4r3rr r0Ú assertTrueÚclosedr1r2)rZ stdin_pipeZ stdout_pipeZ stderr_pipeÚoptionsr:rrrÚtest_communicate_pipe_fd_leakGs(      z-ProcessTestCase.test_communicate_pipe_fd_leakcCs:t tjddg¡}| ¡\}}| |d¡| |d¡dS)Nrr@)rr3rDrEr rFrùrrrÚtest_communicate_returns]s  ÿ  z(ProcessTestCase.test_communicate_returnscCs˜t ¡\}}t |¡t |¡tjtjddtjgtj tj tj d}|  |j j¡|  |j j¡|  |j j¡dtj}| |¡\}}| ||¡dS)Nrzpimport sys,os;sys.stdout.write(sys.stdin.read(47));sys.stderr.write("x" * %d);sys.stdout.write(sys.stdin.read())r/óa)r Úpiper8rr3rDrErÚ PIPE_MAX_SIZEr4rmr1r2r0r rF)rÚxÚyr:Zstring_to_writer1r2rrrÚtest_communicate_pipe_bufes$    üÿø  z)ProcessTestCase.test_communicate_pipe_bufcCs€tjtjddgtjtjtjd}| |jj¡| |jj¡| |j j¡|j   d¡|  d¡\}}|  |d¡|  |d¡dS)Nrz0import sys,os;sys.stdout.write(sys.stdin.read())r/rssplits bananasplitr÷) rr3rDrEr4rmr1r8r2r0rnr rFrùrrrÚtest_writes_before_communicate|s ÿû  z.ProcessTestCase.test_writes_before_communicatec Csìtjddtdg}dD]Î}tj|fidtjdtj|di¤Ž}|”|j d¡|j ¡|  |j   ¡d¡|j d ¡|j  ¡|  |j j ¡|  |j   ¡d ¡|  |j  d ¡d ¡|  |j  ¡d ¡Wdƒq1sÜ0YqdS) Nrúimport sys,os;a@buf = sys.stdout.buffer;buf.write(sys.stdin.readline().encode());buf.flush();buf.write(b"line2\n");buf.flush();buf.write(sys.stdin.read().encode());buf.flush();buf.write(b"line4\n");buf.flush();buf.write(b"line5\r\n");buf.flush();buf.write(b"line6\r");buf.flush();buf.write(b"\nline7");buf.flush();buf.write(b"\nline8");)r|ryr0r1Tzline1 zline3 zline2 ézline4 line5 line6 line7 line8)rDrEÚ SETBINARYrr3r4r0rnÚflushrFr1Úreadliner8rmrÆ)rr*Z extra_kwargr:rrrÚ test_universal_newlines_and_textŒs4ÿþþ     ÿÿ ÿz0ProcessTestCase.test_universal_newlines_and_textcCs^tjtjddtdgtjtjdd}| |jj¡| |j j¡|  ¡\}}|  |d¡dS)Nrr2zÚbuf = sys.stdout.buffer;buf.write(b"line2\n");buf.flush();buf.write(b"line4\n");buf.flush();buf.write(b"line5\r\n");buf.flush();buf.write(b"line6\r");buf.flush();buf.write(b"\nline7");buf.flush();buf.write(b"\nline8");r)r2r1r|z#line2 line4 line5 line6 line7 line8) rr3rDrEr4r4rmr1r8r2r rFrùrrrÚ#test_universal_newlines_communicate³s ÿÿð ÿz3ProcessTestCase.test_universal_newlines_communicatecCsHtjtjddtt d¡gtjdd}| d¡\}}|  |j d¡dS)Nrr2a s = sys.stdin.readline() assert s == "line1\n", repr(s) s = sys.stdin.read() assert s == "line3\n", repr(s) r)r0r|ú line1 line3 r) rr3rDrEr4ÚtextwrapÚdedentr4r rFrrùrrrÚ)test_universal_newlines_communicate_stdinÌs ÿø z9ProcessTestCase.test_universal_newlines_communicate_stdincCs0tjttjtjdd}| ¡| |jd¡dS)NT)r0r1r|r)rr3rr4r rFrr9rrrÚ.test_universal_newlines_communicate_input_noneÚsýz>ProcessTestCase.test_universal_newlines_communicate_input_nonecCsˆtjtjddtt d¡gtjtjtjdd}| |j j ¡| |j j ¡|  d¡\}}|  |jd¡|  d|¡| | d ¡¡dS) Nrr2a§ s = sys.stdin.buffer.readline() sys.stdout.buffer.write(s) sys.stdout.buffer.write(b"line2\r") sys.stderr.buffer.write(b"eline2\n") s = sys.stdin.buffer.read() sys.stdout.buffer.write(s) sys.stdout.buffer.write(b"line4\n") sys.stdout.buffer.write(b"line5\r\n") sys.stderr.buffer.write(b"eline6\r") sys.stderr.buffer.write(b"eline7\r\nz") T)r0r2r1r|r9rzline1 line2 line3 line4 line5 zeline2 eline6 eline7 )rr3rDrEr4r:r;r4rmr1r8r2r rFrr&r rùrrrÚ7test_universal_newlines_communicate_stdin_stdout_stderræs ÿ ð zGProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderrcCsTdD]J}d|}tjd|g}tj|tjtj|d}|jdd\}}| |d¡qdS)N)zutf-16z utf-32-bez@import sys; sys.stdout.buffer.write('1\r\n2\r3\n4'.encode('%s'))r)r0r1Úencodingrrrz1 2 3 4)rDrErr3r4r rF)rr?r£r*Úpopenr1r2rrrÚ-test_universal_newlines_communicate_encodingssþ ýz=ProcessTestCase.test_universal_newlines_communicate_encodingscCs\dD]R\}}d}tjd|g}tj|tjtjd|d}|jdd\}}| |d |¡¡qdS) N))Úignorer)Úreplaceu��)Úsurrogateescapeuí²€í²€)Úbackslashreplacez\x80\x80z2import sys; sys.stdout.buffer.write(b'[\x80\x80]')rúutf-8)r0r1r?Úerrorsrrrz[{}])rDrErr3r4r rFÚformat)rrGÚexpectedr£r*r@r1r2rrrÚtest_communicate_errorss  üz'ProcessTestCase.test_communicate_errorsc CsXts d}nd}g}t ¡}zt|ƒD]t}z.tj |tj¡}|  t  |tj tj B¡¡Wq&t y˜}z(|jtjkrv‚WYd}~qªWYd}~q&d}~00q&| d|¡tdƒD]}t | ¡¡q²tdƒD]>}tjtjddgtjtjtjd}| d ¡d }| |d ¡qÎW|D]} t | ¡qt |¡n"|D]} t | ¡q6t |¡0dS) Niiz4failed to reach the file descriptor limit (tried %d)é érz-import sys;sys.stdout.write(sys.stdin.read())r/slimer)rrkÚmkdtempÚranger r¯r°rZTESTFNÚappendÚopenÚO_WRONLYÚO_CREATÚOSErrorÚerrnoZEMFILEÚskipTestr8Úpoprr3rDrEr4r rFr Úrmtree) rZ max_handlesÚhandlesÚtmpdirÚiZtmpfileÚer:ÚdataÚhrrrÚtest_no_leaking-sF  &ÿ   ÿû þzProcessTestCase.test_no_leakingcCs´| t gd¢¡d¡| t gd¢¡d¡| t gd¢¡d¡| t gd¢¡d¡| t gd ¢¡d ¡| t gd ¢¡d ¡| t gd ¢¡d¡| t ddg¡d¡dS)N)za b crår[z "a b c" d e)úab"cú\råz ab\"c \ d)r_z \råz ab\"c " \\" d)za\\\bzde fgr]za\\\b "de fg" h)za\"brWråz a\\\"b c d)za\\b crår[z "a\\b c" d e)za\\b\ crår[z "a\\b\ c" d eÚabrzab "")rFrÚ list2cmdlinerrrrÚtest_list2cmdlineTs0ÿÿÿÿÿÿÿÿz!ProcessTestCase.test_list2cmdlinecCsbtjtjddgtjd}| |jj¡| |  ¡¡t   |j  ¡d¡|  ¡| |  ¡d¡dS)Nrzimport os; os.read(0, 1)rióAr)rr3rDrEr4rmr0r8Ú assertIsNoneÚpollr rnrârrFr9rrrÚ test_pollfs ÿþzProcessTestCase.test_pollcCs.t t¡}| | ¡d¡| | ¡d¡dSrQ©rr3rrFrr9rrrÚ test_waitqs zProcessTestCase.test_waitcCsvt tjddg¡}| tj¡}|jddWdƒn1s@0Y| dt|j ƒ¡|  |jt j dd¡dS)Nrzimport time; time.sleep(0.3)ç-Cëâ6?rLz0.0001r) rr3rDrErNrOrr]ÚstrrUrFrÚ SHORT_TIMEOUT)rr:rWrrrÚtest_wait_timeoutwsÿ*z!ProcessTestCase.test_wait_timeoutcCs:| t¡t td¡Wdƒn1s,0YdS)Nr)rNr•rr3rrrrrÚtest_invalid_bufsizes z$ProcessTestCase.test_invalid_bufsizecCs>t td¡}| | ¡d¡tjtdd}| | ¡d¡dS)Nr)r<rhr9rrrÚtest_bufsize_is_none…s z$ProcessTestCase.test_bufsize_is_nonec CsØtjtjddgtjtjtjd|d†}|j |¡t  |j  ¡¡|j   ¡}t  ¡2z|j  ¡WntyvYn0Wdƒn1sŒ0Yd|_Wdƒn1s°0Y| |jd¡| ||¡dS)NrzDimport sys;sys.stdout.write(sys.stdin.readline());sys.stdout.flush()r)r0r1r2r<r|r)rr3rDrEr4rr0rnr r8râr1r6rÚSuppressCrashReportrSrFr)rÚlinerIr|r:Z read_linerrrÚ_test_bufsize_equal_ones&ù    $$z'ProcessTestCase._test_bufsize_equal_onecCsd}|j||dddS)Nzline T©r|)rr©rrqrrrÚ test_bufsize_equal_one_text_mode£sz0ProcessTestCase.test_bufsize_equal_one_text_modecCsNdtj ¡}| td¡ |j|dddWdƒn1s@0YdS)Nslinezline bufferingr÷Frs)r Úlinesepr ZassertWarnsRegexÚRuntimeWarningrrrtrrrÚ"test_bufsize_equal_one_binary_mode©sz2ProcessTestCase.test_bufsize_equal_one_binary_modec CsPtdƒD]B}| t¡$tjttjtjdWdƒq1s@0YqdS)Nrír)rNrNr·rr3r¸r4)rrZrrrÚtest_leaking_fds_on_error°s   þz)ProcessTestCase.test_leaking_fds_on_errorc Cs²zddl}|jWn ttfy2| d¡Yn0t dt›d¡}tj d|g}t j |t j dd}||  ¡d}Wdƒn1sŠ0Y| |d ¡| |jd¡dS) Nrzneed msvcrt.CrtSetReportModezL import msvcrt import subprocess cmd = a for report_type in [msvcrt.CRT_WARN, msvcrt.CRT_ERROR, msvcrt.CRT_ASSERT]: msvcrt.CrtSetReportMode(report_type, msvcrt.CRTDBG_MODE_FILE) msvcrt.CrtSetReportFile(report_type, msvcrt.CRTDBG_FILE_STDERR) try: subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) except OSError: pass rT)r2r|rr)ÚmsvcrtZCrtSetReportModeÚAttributeErrorÚ ImportErrorrUr:r;r¸rDrErr3r4r rFr)rrzr£rÚprocr2rrrÚtest_nonexisting_with_pipes¼s  þ* z+ProcessTestCase.test_nonexisting_with_pipescs*g‰‡fdd„}tj|d}| ¡z | t¡(tjttjtjtjdWdƒn1s^0YW|  ¡d}ˆD]<}zt   |¡Wqzt y´}z|}WYd}~qzd}~00qz|durÄ|‚n`|  ¡d}ˆD]>}zt   |¡WqÖt y}z|}WYd}~qÖd}~00qÖ|dur$|‚0dS)Ncs*tdƒD]}ˆ t ¡¡t d¡qdS)Négü©ñÒMbP?)rNÚextendr r,ÚtimeÚsleep)rZ©ÚfdsrrÚopen_fdsès z.open_fds)Útargetr/) Ú threadingÚThreadÚstartrNÚEnvironmentErrorrr3r¸r4r°r r8rS)rr…ÚtÚexcÚfdr[rrƒrÚtest_double_close_on_errorås:   ý&õ z*ProcessTestCase.test_double_close_on_errorcs´t tjddg¡‰| ˆjd¡g‰‡‡fdd„}t d|¡}| ¡t rPd}nd}ˆj t j d |jˆj|d d ˆ  ¡|jˆj|d d |  ¡| d d|fd|fgˆ¡dS)z?Issue21291: Popen.wait() needs to be threadsafe for returncode.rzimport time; time.sleep(12)NcsNˆ dˆ ¡f¡ˆ ¡ˆ ¡ˆ dˆjf¡ˆ ¡ˆ dˆjf¡dS)Núthread-start-poll-resultúthread-after-kill-and-waitúthread-after-second-wait)rOrfÚkillrrr©r}ÚresultsrrÚkill_proc_timer_thread s zDProcessTestCase.test_threadsafe_wait..kill_proc_timer_threadçš™™™™™É?ri÷ÿÿÿrLz*unexpected result in wait from main thread©Úmsgz&unexpected result in second main wait.)rNrr‘)rr3rDrErFrr‡ÚTimerr‰rrrrlr°)rr•r‹Zexpected_errorcoderr“rÚtest_threadsafe_waits4 ÿ  ÿ ÿþýz$ProcessTestCase.test_threadsafe_waitcCs6d d¡}t tjd|g¡}| | d¡t|ƒ¡dS)Nú;)zimport subprocess, syszJretcode = subprocess.call([sys.executable, '-c', 'print("Hello World!")'])zassert retcode == 0rs Hello World!)r°rr\rDrEr&r Úascii)rr£r_rrrÚtest_issue87806s zProcessTestCase.test_issue8780cCsÆt ¡\}}t ¡\}}t ¡\}}ztjdg|||dWnNtyŠt |¡t |¡t |¡t |¡t |¡t |¡Yn0| tj   |¡¡| tj   |¡¡| tj   |¡¡dS)NÚ*r/) rkÚmkstemprr3rSr r8Úremover r¯Úexists)rZifhandleZifnameZofhandleZofnameZefhandleZefnamerrrÚ test_handles_closed_on_exceptionAs"    ÿ       z0ProcessTestCase.test_handles_closed_on_exceptioncCsTtjttjtjtjd}| |jj¡| |jj¡| |jj¡|  dd¡dS)Nr/óxé) rr3rr4rmr1r8r2r0r r9rrrÚtest_communicate_epipeUsýz&ProcessTestCase.test_communicate_epipec Cs²t d¡}|jj}dddgdddfgd¢dddf|dd d |›d fg}tjj tj d ¡F|D]0\}}}}tj ||d }||_ |  t |ƒ|¡q^Wdƒn1s¤0YdS)Nz my-tool.py)ÚlsTé{z#)ÚdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTrzPr¦Fz&)r¦z --my-optsr¨zPézr,©r») ÚpathlibÚPathÚ __class__r$ÚunittestrÚpatchÚobjectrr3rrFÚrepr) rZpath_cmdZ pathlib_clsZcasesrr»r£Zsxr:rrrÚ test_repr`s   ÿù zProcessTestCase.test_reprcCs8tjttjd}| |jj¡| ¡| dd¡dS)Nrir£r¤) rr3rr4rmr0r8rr r9rrrÚ!test_communicate_epipe_only_stdinss ÿz1ProcessTestCase.test_communicate_epipe_only_stdinÚSIGUSR1zRequires signal.SIGUSR1r’zRequires os.killÚgetppidzRequires os.getppidc Cs†dd„}t tj|¡}| tjtj|¡tjddg}dD]H}|tji}tj|fi|¤Ž}| ¡Wdƒq81sv0Yq8dS)NcSsdSrr)ÚsignumÚframerrrÚhandlerƒsz7ProcessTestCase.test_communicate_eintr..handlerrz7import os, signal;os.kill(os.getppid(), signal.SIGUSR1)r) Úsignalr´rmrDrErr4r3r )rr¸Ú old_handlerr*ÚstreamÚkwÚprocessrrrÚtest_communicate_eintr{sÿ z&ProcessTestCase.test_communicate_eintrú /proc/%d/fdzLinux specificcCspdt ¡}t |¡}| t¡&tttjtjtjdWdƒn1sL0Yt |¡}|  ||¡dS)z;Test for the fork() failure fd leak reported in issue16327.r¿r/N) r ÚgetpidÚlistdirrNr'r(rrr4rF)rZ fd_directoryZfds_before_popenZfds_after_exceptionrrrÚ!test_failed_child_execute_fd_leak”s   þ$ z1ProcessTestCase.test_failed_child_execute_fd_leakz+behavior currently not supported on WindowscCsL| t¡}t gd¢¡Wdƒn1s.0Y| |jjd¡dS)N)ú/opt/nonexistent_binaryÚwithZsomer*rÃ)rNrÓrrCrFrUÚfilenamerVrrrÚ%test_file_not_found_includes_filename¦s ,z5ProcessTestCase.test_file_not_found_includes_filenamecCsP| t¡"}tjddgddWdƒn1s20Y| |jjd¡dS)NÚexitÚ0z/some/nonexistent/directoryrÊ)rNrÓrr3rFrUrÅrVrrrÚ test_file_not_found_with_bad_cwd¬s 0z0ProcessTestCase.test_file_not_found_with_bad_cwdcCs,| tjttj¡| tjttj¡dSr)r5rr3ÚbytesÚtypesÚ GenericAliasÚCompletedProcessrkrrrrÚtest_class_getitems²sz#ProcessTestCase.test_class_getitemsN)zr$r%r&r;r>rIrPrSrXr`rbrfrqrtrxr{r}rƒrˆr‹r”r›ržr¦r¨r«r³rµr¶r¹r®ÚskipIfrr¼r½r¾rÁrÄrÈrÎrÏrÐrØrÛrÜrDÚ base_prefixÚprefixrÝÚ sysconfigZis_python_buildrÞràrærèrìrïrñrôrõrörúrýrþrÿrrrrÚplatformZget_config_varrrrrrrrr!r$r)r*r0r1r7r8r<r=r>rArJr^rcrgrirmrnrorrrurxryr~rŽršrr¢r¥r²r³Ú skipUnlessÚhasattrr¹r r¾r¯ÚisdirrÀrÂrÆrÉrÎrrrrr.gs                  ÿ ÿ ÿ           ÿÿ  ' '  )4   ÿ ÿ ÿÿ     r.c@s°eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Ze ed%¡d&d'„ƒZd(S))ÚRunFuncTestCasecKstjd|g}tj|fi|¤ŽS)z4Run Python code in a subprocess using subprocess.runr)rDrErr)rr£r+ÚargvrrrÚ run_python·s zRunFuncTestCase.run_pythoncCsP| d¡}| |jd¡| tj¡| ¡Wdƒn1sB0YdSr©)rÙrFrrNrrTÚcheck_returncode©rÚcprrrÚtest_returncode¼s zRunFuncTestCase.test_returncodecCsN| tj¡}|jdddWdƒn1s00Y| |jjd¡dS)Nr@T©ÚcheckrA)rNrrTrÙrFrUrrVrrrÚ test_checkÃs,zRunFuncTestCase.test_checkcCs tjtdd}| |jd¡dS)NTrÞr)rrrrFrrÛrrrÚtest_check_zeroÈszRunFuncTestCase.test_check_zerocCs>| tj¡|jdddWdƒn1s00YdS)NrJrjrL)rNrrOrÙrrrrÚ test_timeoutÍszRunFuncTestCase.test_timeoutcCs"|jdtjd}| d|j¡dS)NrYrrZ©rÙrr4r]r1rÛrrrÚtest_capture_stdoutÕsz#RunFuncTestCase.test_capture_stdoutcCs"|jdtjd}| d|j¡dS)NrcrdrZ)rÙrr4r]r2rÛrrrÚtest_capture_stderrÚsÿz#RunFuncTestCase.test_capture_stderrcCsLt ¡}| |j¡| d¡| d¡|jd|tjd}|  d|j ¡dS)Nrgrrhr§rj) rkrlrmr8rnrorÙrr4r]r1)rrprÜrrrrqßs   þz+RunFuncTestCase.test_check_output_stdin_argcCs$|jddtjd}| d|j¡dS)Nrhrg)rsr1rjrãrÛrrrrtês þz+RunFuncTestCase.test_check_output_input_argcCs’t ¡}| |j¡| d¡| d¡|jtdd }|jd|dd}Wdƒn1s\0Y|  d|j j d¡|  d |j j d¡dS) Nrgrr†r—r~r„r…r0rs) rkrlrmr8rnrorNr€rÙr]rUr*r‡rrrrˆñs   ÿÿ$z6RunFuncTestCase.test_check_output_stdin_with_input_argcCsb| tj¡"}|jddtjd}Wdƒn1s40Y| |jjd¡| |jjd¡dS)Nr‰rŠ)rMr1rZ) rNrrOrÙr4rFrUr_r1)rrWrÜrrrr‹þsù$z)RunFuncTestCase.test_check_output_timeoutcCs2tj ¡}d|d<|jd|d}| |jd¡dS)NrŒrzCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31)rŽé!)r r‘r’rÙrFr)rr“rÜrrrÚtest_run_kwargs s  þzRunFuncTestCase.test_run_kwargscCs”trdnd}t |¡}|dur.| |›d¡t|ƒ}tj|tjd}| |j d¡|  t ¡"tj|tjddWdƒn1s†0YdS)Nztree.comr¦z required for this testrrT)r1r») rr r rUrrrrrFrrNr•)rÚprogr¯ÚresrrrÚtest_run_with_pathlike_paths   z+RunFuncTestCase.test_run_with_pathlike_pathcCs2t tj¡}|ddg}t |¡}| |jd¡dS)Nrsimport sys; sys.exit(57)é9)r r´rDrErrrFr©rr¯r*rérrrÚ&test_run_with_bytes_path_and_arguments"s   z6RunFuncTestCase.test_run_with_bytes_path_and_argumentscCs0ttjƒ}|ddg}t |¡}| |jd¡dS)Nrzimport sys; sys.exit(57)rë)rrDrErrrFrrìrrrÚ)test_run_with_pathlike_path_and_arguments)s   z9RunFuncTestCase.test_run_with_pathlike_path_and_argumentscCs.|jddd}| d|j¡| d|j¡dS)Nz>import sys;sys.stdout.write('BDFL'); sys.stderr.write('FLUFL')T)Úcapture_outputrZsFLUFL)rÙr]r1r2rÛrrrÚtest_capture_output0s ýz#RunFuncTestCase.test_capture_outputcCs~t ¡}| |j¡|jtdd }|jdd|d}Wdƒn1sH0Y| d|jj d¡| d|jj d¡dS) NzAExpected ValueError when stdout and capture_output args supplied.r—r~T)rïr1r1rrï© rkrlrmr8rNr€rÙr]rUr*r‡rrrÚ#test_stdout_with_capture_output_arg8s ÿÿ$z3RunFuncTestCase.test_stdout_with_capture_output_argcCs~t ¡}| |j¡|jtdd }|jdd|d}Wdƒn1sH0Y| d|jj d¡| d|jj d¡dS) NzAExpected ValueError when stderr and capture_output args supplied.r—r~T)rïr2r2rrïrñr‡rrrÚ#test_stderr_with_capture_output_argDs ÿÿ$z3RunFuncTestCase.test_stderr_with_capture_output_argz)requires posix like 'sleep' shell commandc Cs€t ¡}ztjdddddWn6tjyT}zt ¡}t ¡}WYd}~nd}~00| d¡|j||dd|›d d dS) zJOutput capturing after a timeout mustn't hang forever on open filehandles.zsleep 3TrK)r»rMrïNzTimeoutExpired not raised.gø?z/TimeoutExpired was delayed! Bad traceback: ``` z```r—) rÚ monotonicrrrOÚ tracebackÚ format_excrZ assertLess)rZ before_secsrŒZ after_secsZstacksrrrÚ.test_run_with_shell_timeout_and_capture_outputTs ÿ   ÿÿz>RunFuncTestCase.test_run_with_shell_timeout_and_capture_outputN)r$r%r&rÙrÝràrárârärårqrtrˆr‹rçrêrírîrðròrór®rÏrr÷rrrrr×¶s(    r×c CsJdD]6}trzt |¡Wnty0YqYn0|Sqt d¡‚dS)N)ZstaffZnogroupÚgrpÚnobodyZ nfsnobodyz?No identified group name to use for this test on this platform.)røÚgetgrnamÚKeyErrorr®ÚSkipTest)Ú name_grouprrrÚ_get_test_grp_namees   rþzPOSIX specific testscseZdZ‡fdd„Zdd„Zdd„Zdd„Zd d „ZGd d „d ej ƒZ e   d ¡dd„ƒZ e   d ¡dd„ƒZe ej d¡ d¡dd„ƒZdd„Ze eedƒd¡dd„ƒZe eedƒd¡dd„ƒZe eedƒd ¡d!d"„ƒZe eedƒd#¡d$d%„ƒZe eed&ƒd'¡d(d)„ƒZe eed&ƒd*¡d+d,„ƒZe ep@eed-ƒ d.¡d/d0„ƒZd1d2„Z d3d4„Z!d5d6„Z"d7d8„Z#d9d:„Z$d;d<„Z%Gd=d>„d>ej ƒZ&e ej d?¡ d@¡dAdB„ƒZ'dCdD„Z(e e)j*dEkdF¡dGdH„ƒZ+dIdJ„Z,dKdL„Z-dMdN„Z.dOdP„Z/dQdR„Z0dSdT„Z1dUdV„Z2e e)j* 3dW¡dX¡dYdZ„ƒZ4d[d\„Z5d]d^„Z6d_d`„Z7dadb„Z8dcdd„Z9dedf„Z:dgdh„Z;didj„Zdodp„Z?dqdr„Z@dsdt„ZAdudv„ZBdwdx„ZCdydz„ZDd{d|„ZEd}d~„ZFdd€„ZGdd‚„ZHdƒd„„ZId…d†„ZJd‡dˆ„ZKd‰dŠ„ZLd‹dŒ„ZMddŽ„ZNdd„ZOd‘d’„ZPe e)j* 3d“¡o,e Qd”¡jRe Qd•¡jRkd–¡d—d˜„ƒZSeT Ud™dš¡d›dœ„ƒZVddž„ZWdŸd „ZXd¡d¢„ZYd£d¤„ZZd¥d¦„Z[d§d¨„Z\d©dª„Z]d«d¬„Z^d­d®„Z_d¯d°„Z`eTjad±d²„ƒZbeTjad³d´„ƒZcdµd¶„Zdd·d¸„Zed¹dº„Zfd»d¼„Zge ehd½uoðeehd¾ƒd¿¡dÀdÁ„ƒZidÂdÄZjdÄdÅ„ZkdÆdÇ„Zl‡ZmS)ÈÚPOSIXProcessTestCasecstƒ ¡d|_dS)Nz/_this/pa.th/does/not/exist)ÚsuperrÚ_nonexistent_dirr©r­rrrts zPOSIXProcessTestCase.setUpc CsNzt |j¡Wn(ty8}z|}WYd}~nd}~00| d|j¡|S)Nz,chdir to nonexistent directory %s succeeded.)r ÚchdirrrSr)rr[Údesired_exceptionrrrÚ_get_chdir_exceptionxsÿz)POSIXProcessTestCase._get_chdir_exceptionc CsŒ| ¡}ztjtjddg|jd}WnTtyx}z<| |j|j¡| |j |j ¡| |j |j ¡WYd}~nd}~00|  d|¡dS)z;Test error in the child raised in the parent for a bad cwd.rrrÊNúExpected OSError: %s© rrr3rDrErrSrFrTÚstrerrorrÅr©rrr:r[rrrÚtest_exception_cwd…sÿ &z'POSIXProcessTestCase.test_exception_cwdc CsŒ| ¡}ztjtjddg|jd}WnTtyx}z<| |j|j¡| |j |j ¡| |j |j ¡WYd}~nd}~00|  d|¡dS)zBTest error in the child raised in the parent for a bad executable.rrr®Nrrr rrrÚtest_exception_bad_executable”sÿ &z2POSIXProcessTestCase.test_exception_bad_executablec Cs†| ¡}zt |jddg¡}WnTtyr}z<| |j|j¡| |j|j¡| |j|j¡WYd}~nd}~00|  d|¡dS)z?Test error in the child raised in the parent for a bad args[0].rrNr) rrr3rrSrFrTrrÅrr rrrÚtest_exception_bad_args_0£s&z.POSIXProcessTestCase.test_exception_bad_args_0c@seZdZdd„ZdS)z&POSIXProcessTestCase.PopenNoDestructorcCsdSrrrrrrÚ__del__¹sz.POSIXProcessTestCase.PopenNoDestructor.__del__N)r$r%r&r rrrrÚPopenNoDestructor¸srz%subprocess._posixsubprocess.fork_execc Csvdd„}||_tjdtdF| t¡| dg¡Wdƒn1sJ0YWdƒn1sh0YdS)z>Test error passing done through errpipe_write in the good casecWs0|d}d tj¡ ¡}t |d|d¡dS)Né z{:x}sOSError:ó:r)rHrTZEISDIRr r rn)r*Ú errpipe_writeZerr_coderrrÚ proper_error¿szHPOSIXProcessTestCase.test_exception_errpipe_normal..proper_errorúsubprocess.os.waitpid©Ú side_effectÚnon_existent_commandN)rrr¯ÚChildProcessErrorrNÚIsADirectoryErrorr)rÚ fork_execrrrrÚtest_exception_errpipe_normal¼sÿ z2POSIXProcessTestCase.test_exception_errpipe_normalc s–d‰‡fdd„}||_tjdtdH| tj¡}| dg¡Wdƒn1sT0YWdƒn1sr0Y| t ˆƒt |j ƒ¡dS)zZTest error passing done through errpipe_write where its not in the expected formatsÿÞ­cs|d}t |ˆ¡dS)Nrr)r rn)r*r©Z error_datarrÚ bad_errorÒs zGPOSIXProcessTestCase.test_exception_errpipe_bad_data..bad_errorrrrN) rrr¯rrNrÚSubprocessErrorrr]r±rkrU)rrrr[rrrÚtest_exception_errpipe_bad_dataÍs ÿHz4POSIXProcessTestCase.test_exception_errpipe_bad_dataú/proc/self/statuszneed /proc/self/statuscCs‚tjddgdd}| ¡D]}| d¡r|}qrCr?rrrrÚtest_group_errorns z%POSIXProcessTestCase.test_group_errorÚ setgroupszno setgroups() on platformc Cs®t ¡}|dkrdndg}tƒ}d}tdur6| |¡ztjtjddg|d}Wn6t y†}z|j t j krn‚d}WYd}~nfd}~00t  ¡}t  |¡}tdur²dd „|Dƒ} n|} |rÐ| t|ƒt|ƒ¡n| t| ƒt|ƒ¡| t¡ tjtd gdWdƒn1s0Y| t¡(tjttjtjd gd Wdƒn1sZ0Ytdurª| t¡ tjt|gdWdƒn1s 0YdS) Nr+r,Frz;import os, sys, json; json.dump(os.getgroups(), sys.stdout)©Ú extra_groupsTcSs&g|]}t|tƒrt |¡jn|‘qSr)r9rkrørúrE)r ÚgrrrrŒsÿz:POSIXProcessTestCase.test_extra_groups..r1r3)rÀrrL)r rDrþrørOrr\rDrErSrTr&Ú getgroupsÚjsonÚloadsrFÚsetrNr€rRrrÒr‘) rrFrGrýZ perm_errorr_ÚexZ parent_groupsZ child_groupsZ desired_gidsrrrÚtest_extra_groupsssN ÿý   ÿ 0 þ&  ÿz&POSIXProcessTestCase.test_extra_groupsz!setgroups() available on platformcCs<| t¡tjtgdWdƒn1s.0YdS)NrKr?rrrrÚtest_extra_groups_error¤s z,POSIXProcessTestCase.test_extra_groups_errorÚumaskzPOSIX umask() is not available.c Csžd}z€t ¡}tj |d¡}tjtjdd|›dgddt  |¡j d@}d}|j ||t |ƒ›d t |ƒ›d W|duršt  |¡n|dur˜t  |¡0dS) NZbeansrzopen(z, 'w').close()é+)rUi¶i”z != r—)rkrMr r¯r°rrRrDrEÚstatÚst_moderFÚoctr rW)rrYÚnamerXZ expected_moderrrÚ test_umask©s"þÿ ÿzPOSIXProcessTestCase.test_umaskcCsXt ¡*t tjddg¡}| ¡Wdƒn1s80Y| |j t j ¡dS)Nrzimport os; os.abort()) rrprr3rDrErrFrr¹ÚSIGABRTr9rrrÚtest_run_abort¿s   ÿ&z#POSIXProcessTestCase.test_run_abortcCsNt ttjƒ d¡}t|ƒ}| d| ¡¡| d|¡| ttjƒ|¡dS)Núfake cmdr¹ZSIG)rrTr(r¹r\rkr]Úlower©rr¥Z error_stringrrrÚ"test_CalledProcessError_str_signalÇs  z7POSIXProcessTestCase.test_CalledProcessError_str_signalcCs$t dd¡}t|ƒ}| d|¡dS)NiÁKiÿr^zunknown signal 9876543.©rrTrkr]r`rrrÚ*test_CalledProcessError_str_unknown_signalÒs z?POSIXProcessTestCase.test_CalledProcessError_str_unknown_signalcCs$t dd¡}t|ƒ}| d|¡dS)Nér^znon-zero exit status 2.rbr`rrrÚ$test_CalledProcessError_str_non_zero×s z9POSIXProcessTestCase.test_CalledProcessError_str_non_zerocCsXtjtjddgtjdd„d}|"| |j ¡d¡Wdƒn1sJ0YdS)NrrcSs t dd¡S)NrÚapple)r ÚputenvrrrrÚãr÷z3POSIXProcessTestCase.test_preexec..)r1Ú preexec_fnóapplerër9rrrÚ test_preexecÜs ÿüz!POSIXProcessTestCase.test_preexecc Csšdd„}ztjtjddg|d}WnhtjyV}z| tjd¡WYd}~nHd}~0tyŠ}z| d|j d¡WYd}~nd}~00|  d ¡dS) NcSs tdƒ‚dS)Nz'What if two swallows carried a coconut?©r€rrrrÚraise_itèsz=POSIXProcessTestCase.test_preexec_exception..raise_itrr©riz)Expected a ValueError from the preexec_fnZcoconutrzEException raised by preexec_fn did not make it to the parent process.) rr3rDrErr&Ú_posixsubprocessr€r]r*r)rrmr:r[rrrÚtest_preexec_exceptionçsÿ þ(z+POSIXProcessTestCase.test_preexec_exceptionc@s eZdZdZdd„Zdd„ZdS)z+POSIXProcessTestCase._TestExecuteChildPopenz3Used to test behavior at the end of _execute_child.cOs$||_tjj|g|¢Ri|¤ŽdSr)Ú _testcaserr3r–)rZtestcaser*r+rrrr–ùsz4POSIXProcessTestCase._TestExecuteChildPopen.__init__cOsz”tjj|g|¢Ri|¤ŽWdd„tdƒDƒ}zL|D].}|jj||j ¡|j ¡|j  ¡fddq6W|D]}t   |¡qln|D]}t   |¡q‚0nxdd„tdƒDƒ}zL|D].}|jj||j ¡|j ¡|j  ¡fddq®W|D]}t   |¡qän|D]}t   |¡qú00dS)NcSsg|]}t dtj¡‘qS)ú /dev/zero)r rPÚO_RDONLY©r r#rrrrsÿzNPOSIXProcessTestCase._TestExecuteChildPopen._execute_child..éz!At least one fd was closed early.r—) rr3r,rNrqrwr0râr1r2r r8)rr*r+Z devzero_fdsrrrrr,ýs@ÿÿý ÿöÿÿý ÿz:POSIXProcessTestCase._TestExecuteChildPopen._execute_childN)r$r%r&r-r–r,rrrrÚ_TestExecuteChildPopen÷srvrrz/dev/zero required.c CsTdd„}| tj¡,|j|ttjtjtj|dWdƒn1sF0YdS)z6Issue16140: Don't double close pipes on preexec error.cSst d¡‚dS)Nz-force the _execute_child() errpipe_data path.)rrrrrrrmsÿzWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes..raise_it)r0r1r2riN)rNrrrvrr4)rrmrrrÚ0test_preexec_errpipe_does_not_double_close_pipessýzEPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipescCs&dd„}t ¡}tj}tj}zèt ¡| t ¡¡tjtjddgdd„d| t ¡d¡t ¡|  t ¡¡tjtjddgd d„d|  t ¡d ¡|t_|j t tj tjddgd d„dt`|j t tj tjddgd d„dW|t_|t_|s"t ¡n|t_|t_|s t ¡0dS) NcSs tdƒ‚dS)Nzthis shouldn't escape)Ú RuntimeErrorrrrrÚraise_runtime_error!szPPOSIXProcessTestCase.test_preexec_gc_module_failure..raise_runtime_errorrrcSsdSrrrrrrrh*r÷zEPOSIXProcessTestCase.test_preexec_gc_module_failure..rnz#Popen enabled gc when it shouldn't.cSsdSrrrrrrrh1r÷zPopen left gc disabled.cSsdSrrrrrrrh7r÷cSsdSrrrrrrrh<r÷)ÚgcÚ isenabledÚdisabler rrCrDrEÚenabler&rNrxr3r{)rryZenabledZorig_gc_disableZorig_gc_isenabledrrrÚtest_preexec_gc_module_failuresJÿ ÿÿ  þ  þ ýz3POSIXProcessTestCase.test_preexec_gc_module_failurer-z!setrlimit() seems to fail on OS Xc Cs´zddlm}m}m}Wn.tyF}z| |¡WYd}~n d}~00||ƒ}|\}}||d|fƒ| |||¡ztjt j ddgdd„dWnt y¤Yn 0| d¡dS) Nr)Ú getrlimitÚ setrlimitÚ RLIMIT_NPROCrrcSsdSrrrrrrrhRr÷z@POSIXProcessTestCase.test_preexec_fork_failure..rnz.RLIMIT_NPROC had no effect; probably superuser) Úresourcerr€rr|rUrmrrCrDrEÚBlockingIOError)rrr€rr¥Zlimitsr#ZhardrrrÚtest_preexec_fork_failureCs ÿ  z.POSIXProcessTestCase.test_preexec_fork_failurecCs”t ¡\}}t|ddd0}| dtj¡| dtj¡Wdƒn1sP0Yt  |d¡t   |¡}|  ¡t  |¡| |jd¡dS©NÚwrD)rGz#!%s z(exec '%s' -c 'import sys; sys.exit(47)' iÀrA)rkrŸrPrnrÚ unix_shellrDrEr Úchmodrr3rr rFr)rrÚfnameÚfobjr:rrrÚtest_args_stringYs ÿ$   z%POSIXProcessTestCase.test_args_stringcCs<|jttjtjddgdd|jttjtjddgdddS)Nrr@rA©Ú startupinfo©Ú creationflags©rNr€rrCrDrErrrrr›gs ÿý ÿýz&POSIXProcessTestCase.test_invalid_argscCshtj ¡}d|d<tjdgdtj|d}|(| |j ¡  d¡d¡Wdƒn1sZ0YdS©Nrfrz echo $FRUITr©r»r1rs rj© r r‘r’rr3r4rFr1rÆr©rr“r:rrrÚtest_shell_sequencers  þz(POSIXProcessTestCase.test_shell_sequencecCsftj ¡}d|d<tjddtj|d}|(| |j ¡  d¡d¡Wdƒn1sX0YdSr‘r“r”rrrÚtest_shell_string|s þz&POSIXProcessTestCase.test_shell_stringcCsŠt ¡\}}t|ddd0}| dtj¡| dtj¡Wdƒn1sP0Yt  |d¡t   |¡}t  |¡|  |d¡dSr…)rkrŸrPrnrr‡rDrEr rˆrrCr rF)rrr‰rŠrHrrrÚtest_call_string†s ÿ$   z%POSIXProcessTestCase.test_call_stringc CsÒg}dD]2}dD](}tj ||¡}tj |¡r| |¡qq|sJ| d¡d}tj |¡rptj |¡sp| |¡|D]X}tjd|dtj d}|,|  |j   ¡  ¡t|dƒ¡Wdƒqt1sÂ0YqtdS) N)z/binz /usr/bin/z/usr/local/bin)ZbashZkshz"bash or ksh required for this testz/bin/shzecho $0T)rEr»r1rœ)r r¯r°ÚisfilerOrUÚislinkrr3r4rFr1rÆrrÊ)rZshellsrÑrZÚshr:rrrÚtest_specific_shell“s"    ÿz(POSIXProcessTestCase.test_specific_shellc Gstt tjtj¡}z4tjtjddgdtjtjtjd}Wt tj|¡nt tj|¡0|j  d¡t ||ƒ|Ž|S)Nrzöif 1: import sys, time sys.stdout.write('x\n') sys.stdout.flush() time.sleep(30) T©r0r0r1r2r) r¹ÚSIGINTÚdefault_int_handlerrr3rDrEr4r1rÆÚgetattr)rÚmethodr*rºr:rrrÚ _kill_process§s÷  z"POSIXProcessTestCase._kill_process)ZnetbsdZopenbsdz"Due to known OS bug (issue #16762)cGsRtjtjddgdtjtjtjd}|j d¡t d¡t ||ƒ|Ž|  ¡dS)Nrz¶if 1: import sys, time sys.stdout.write('x\n') sys.stdout.flush() Trœr) rr3rDrEr4r1rÆrr‚rŸr )rr r*r:rrrÚ_kill_dead_processÀsø  z'POSIXProcessTestCase._kill_dead_processcCs:| dtj¡}| ¡\}}| d|¡| | ¡d¡dS)NÚ send_signalsKeyboardInterruptr)r¡r¹rr r]r#r©rr:r#r2rrrÚtest_send_signal×s  z%POSIXProcessTestCase.test_send_signalcCs:| d¡}| ¡\}}| |d¡| | ¡tj ¡dS)Nr’r÷)r¡r rFrr¹ÚSIGKILLr¤rrrÚ test_killÝs   zPOSIXProcessTestCase.test_killcCs:| d¡}| ¡\}}| |d¡| | ¡tj ¡dS)NÚ terminater÷)r¡r rFrr¹ÚSIGTERMr¤rrrÚtest_terminateãs   z#POSIXProcessTestCase.test_terminatecCs| dtj¡dS©Nr£)r¢r¹rrrrrÚtest_send_signal_deadész*POSIXProcessTestCase.test_send_signal_deadcCs| d¡dS©Nr’©r¢rrrrÚtest_kill_deadísz#POSIXProcessTestCase.test_kill_deadcCs| d¡dS©Nr¨r®rrrrÚtest_terminate_deadñsz(POSIXProcessTestCase.test_terminate_deadcCs6g}|D](}t |¡}t |¡}| |||f¡q|Sr)r Úget_inheritableÚduprO)rZsave_fdsr„rÚ inheritableÚsavedrrrÚ _save_fdsõs   zPOSIXProcessTestCase._save_fdscCs.|D]$\}}}tj|||dt |¡qdS)N)r´)r Údup2r8)rr„rrµr´rrrÚ _restore_fdsýsz!POSIXProcessTestCase._restore_fdsc Cs d}| |¡}|D]\}}}|dkr|}q.qz`|D]}t |¡q4tjtjddg|tjtjd ¡\}}|  |d¡|  |d¡W|  |¡n |  |¡0dS)Nrrrûr/rjrê) r¶r r8rr3rDrEr4r rFr¸) rr„r0Ú saved_fdsrrµr´r¤r¥rrrÚcheck_close_std_fds s&   ÿù z(POSIXProcessTestCase.check_close_std_fdscCs| dg¡dSrQ©rºrrrrÚtest_close_fd_0 sz$POSIXProcessTestCase.test_close_fd_0cCs| dg¡dS©Nrr»rrrrÚtest_close_fd_1 sz$POSIXProcessTestCase.test_close_fd_1cCs| dg¡dS)Nrdr»rrrrÚtest_close_fd_2! sz$POSIXProcessTestCase.test_close_fd_2cCs| ddg¡dS)Nrrr»rrrrÚtest_close_fds_0_1$ sz'POSIXProcessTestCase.test_close_fds_0_1cCs| ddg¡dS)Nrrdr»rrrrÚtest_close_fds_0_2' sz'POSIXProcessTestCase.test_close_fds_0_2cCs| ddg¡dS)Nrrdr»rrrrÚtest_close_fds_1_2* sz'POSIXProcessTestCase.test_close_fds_1_2cCs| gd¢¡dS)N)rrrdr»rrrrÚtest_close_fds_0_1_2- sz)POSIXProcessTestCase.test_close_fds_0_1_2c Cs¢t d¡}t d¡}zZt d¡t d¡t tjddg¡ ¡Wt |d¡t |d¡t |¡t |¡n.t |d¡t |d¡t |¡t |¡0dS)z=Issue #15798: Popen should work when stdio fds are available.rrrz*print('AssertionError:0:CLOEXEC failure.')N) r r³r8rr3rDrErr·)rZ new_stdinZ new_stdoutrrrÚtest_small_errpipe_write_fd2 s"    þ     ý   z0POSIXProcessTestCase.test_small_errpipe_write_fdc Cs^dd„tdƒDƒ}z,dd„|Dƒ}|D]\}}t |¡q(t |dd¡t |ddd¡| tdƒ¡}zZt|ƒD]\}}t ||¡qvtj t j dd g|d|d |dd }|  ¡W|  |¡n |  |¡0|D]}t |dd¡qØt |d d ¡}t |dd ¡ ¡} | |d ¡| | d¡W|D]}t |¡q.n|D]}t |¡qF0dS)NcSsg|] }t ¡‘qSr©rkrŸ©r rZrrrrI r÷z?POSIXProcessTestCase.test_remapping_std_fds..rŠcSsg|] \}}|‘qSrr©r rr‰rrrrK r÷róSTDINrrúZimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err")rdr/ríó got STDINóerr)rNr Úunlinkrnrãr¶Ú enumerater·rr3rDrErr¸rÆrrFr8) rÚtempsÚtemp_fdsrr‰r¹Útemp_fdr:r¤r¥rrrÚtest_remapping_std_fdsG s<   ÿû  ÿz+POSIXProcessTestCase.test_remapping_std_fdsc CsBdd„tdƒDƒ}dd„|Dƒ}z|D]\}}t |¡q(| tdƒ¡}zœt|ƒD]\}} t | |¡qTt |d¡t |dd¡tj t j ddg|||d } |   ¡|D]}t |dd¡qªt  |d ¡} t  |d ¡ ¡} W| |¡n | |¡0| | d ¡| | d ¡W|D]}t |¡qn|D]}t |¡q*0dS) NcSsg|] }t ¡‘qSrrÅrÆrrrrv r÷z7POSIXProcessTestCase.check_swap_fds..rŠcSsg|] \}}|‘qSrrrÇrrrrw r÷rÈrrrÉr/rírÊrË)rNr rÌr¶rÍr·rnrãrr3rDrErrÆrr¸rFr8) rZstdin_noZ stdout_noZ stderr_norÎrÏrr‰r¹rÐr:r¤r¥rrrÚcheck_swap_fdst s<    ÿû  ÿz#POSIXProcessTestCase.check_swap_fdscCsX| ddd¡| ddd¡| ddd¡| ddd¡| ddd¡| ddd¡dS)Nrrrd)rÒrrrrÚ test_swap_fds¤ s z"POSIXProcessTestCase.test_swap_fdscCsŒ| tdƒ¡}zj|D]<}t ¡ }t | ¡|¡Wdƒq1sH0Yqttdƒƒt|ƒ ¡}t  |¡gd¢}i}t ||ƒD]\}} |||| <qŒt   d¡} ttdƒƒt|ƒ ¡} t jtjd| t| ƒgfi|¤Ž} | | d¡t ||ƒD]r\}} t |dtj¡t |d¡} ttt|  d¡ƒƒ}t   d|›d |›d |›d |›d | ›d ¡}| | g||¡qúW| |¡n | |¡0dS)NrŠr/zå import os, sys skipped_fd = int(sys.argv[1]) for fd in range(3): if fd != skipped_fd: os.write(fd, str(fd).encode('ascii')) rrrírœz" When testing z to z4 redirection, parent descriptor z5 got redirected to descriptor(s) z instead of descriptor z. )r¶rNrkrlr r·rârQrVr8Úzipr:r;rrCrDrErkrFrãÚSEEK_SETrÆrÚmapr(rÇr¸)rÚfrom_fdsÚto_fdsr¹Zfrom_fdÚfZ fd_to_closeÚ arg_namesr+Zto_fdr£Z skipped_fdrHÚ read_bytesZread_fdsr˜rrrÚ#_check_swap_std_fds_with_one_closed¬ sD 0  ÿ  ÿÿþýý z8POSIXProcessTestCase._check_swap_std_fds_with_one_closedcCs<t tdƒd¡D]&}t tdƒd¡D]}| ||¡q$qdS)NrŠrd)Ú itertoolsÚ combinationsrNÚ permutationsrÜ)rr×rØrrrÚ!test_swap_std_fds_with_one_closedØ sz6POSIXProcessTestCase.test_swap_std_fds_with_one_closedc Csªdd„}ztjt|dWn€tyZ}z(| tj¡| t|ƒd¡WYd}~nTd}~0tjyš}z(|  tj¡| t|ƒd¡WYd}~nd}~00|  d¡dS)NcSs tdƒ‚dS)Nõ surrogate:í³¿rlrrrrÚprepareÞ szCPOSIXProcessTestCase.test_surrogates_error_message..preparernráz!Exception occurred in preexec_fn.z1Expected ValueError or subprocess.SubprocessError) rrCrr€rerorFrkrÚassertIsNotNoner)rrâr¥rrrÚtest_surrogates_error_messageÝ sþ  $ &z2POSIXProcessTestCase.test_surrogates_error_messagecCsÞdD]Ô\}}| dd¡}dt|ƒ}tj ¡}|||<d|d<|}tjtjd|g|d}|  d ¡}|  |  d¡t |ƒ¡| dd¡}d t|ƒ}tj ¡}|||<tjtjd|g|d}|  d ¡}|  |  d¡t |ƒ¡qdS) N))Útestuabcí³¿)utestí³¿Z42rœrDz&import os; print(ascii(os.getenv(%s)))ÚCÚLC_ALLrrŽs z'import os; print(ascii(os.getenvb(%s)))) r r±r r‘r’rr\rDrEr¡rFrÇrœ)rÚkeyÚvalueZ encoded_valueÚscriptrZ decoded_valuer1rrrÚtest_undecodable_envð s.     þ     þ z)POSIXProcessTestCase.test_undecodable_envc Csøt td¡}ttdd…ƒ}tj td¡\}}t |¡}t |g|¡}| |d¡d|d  |¡  d¡f}tj|dd}| |d¡tj   ¡}||d<tj|g||d }| |d¡tj   ¡}t |¡|d <tj|g||d }| |d¡dS) Nrrs'%s' %sú rFTrªÚPATHrŽsPATH)r r´rrr¯rÃrrCrFr°r r‘r’Úenvironb) rZ abs_programr*r¯ZprogramÚexitcoderrZenvbrrrÚtest_bytes_program s"      z'POSIXProcessTestCase.test_bytes_programc CsÂtjddd}tjddd}tjtj|gtjtjtjdd}| |jd¡tjtj|gtjdd}| ¡\}}t t t |  d ¡ƒƒ}t |j  ¡|j ¡|j ¡gƒ}| ||@d |||@f¡dS) Nzinput_reader.pyÚsubprocessdata©Zsubdirú fd_status.pyF)r0r1r2r0r÷©r1r0ó,z5Expected no fds from %r to be open in child, found %r)rÚfindfilerr3rDrEr4rmr rQrÖr(rÃr0râr1r2r ) rZsleeperÚ fd_statusÚp1Úp2r_ÚerrorZ result_fdsZ unwanted_fdsrrrÚtest_pipe_cloexec( s( þ ÿ ÿ  þÿz&POSIXProcessTestCase.test_pipe_cloexecc stjddd}tjddd}d}|dd}tjtj|gtjtjdd ‰tjtj||gˆjtjdd ‰| ˆj ¡| ˆj ¡‡fd d „}‡fd d „}| |¡| |¡ˆj   |¡ˆj   ¡t   ˆjgggd¡\}}} | |d¡| ˆj ¡|¡ˆj  ¡ˆj  ¡dS)Nzqcat.pyrñròzqgrep.pyszxcvbnéó F)r0r1r0cs$z ˆ ¡WntyYn0dSr©r¨ÚProcessLookupErrorr)rørrÚkill_p1P s  zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools..kill_p1cs$z ˆ ¡WntyYn0dSrrþr)rùrrÚkill_p2U s  zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools..kill_p2rKzThe child hung)rrörr3rDrEr4r1rmrr0rnr8Úselectr&rFrÆ) rZqcatZqgrepZsubdatar\rrZ readfilesZignored1Zignored2r)rørùrÚtest_pipe_cloexec_real_tools? s2  þþ          z1POSIXProcessTestCase.test_pipe_cloexec_real_toolsc s¨tjddd}t ¡}| tj|d¡| tj|d¡t|ƒ‰tdƒD],}t tj tj ¡}| tj|¡ˆ  |¡qJˆD]}t  |d¡q|t jtj|gt jdd }| ¡\}}ttt| d ¡ƒƒ}| |ˆ@ˆd ¡t jtj|gt jdd }| ¡\}}ttt| d ¡ƒƒ}| |ˆ@d ¡| d|d ¡t‡fdd„tdƒDƒƒ} t jtj|gt jd| d}| ¡\}}ttt| d ¡ƒƒ}| || ˆ@d¡| d|d ¡dS)Nrórñròrré TFrôrõzSome fds were closedzSome fds were left openzSubprocess failedc3s|]}ˆ ¡VqdSr)rVrt©r…rrÚ Œ r÷z6POSIXProcessTestCase.test_close_fds..ru©r1r0Úpass_fdsz'Some fds not in pass_fds were left open)rrör r,rmr8rQrNrPÚdevnullrsÚaddÚset_inheritablerr3rDrEr4r rÖr(rÃrFr r]) rr÷r„r#rr:r_ÚignoredÚ remaining_fdsÚ fds_to_keeprrrÚtest_close_fdsh sN   ÿ  ÿ ÿ  ÿ þ ÿz#POSIXProcessTestCase.test_close_fdsZfreebsdz/devz/dev/fdz/Requires fdescfs mounted on /dev/fd on FreeBSD.cCsªtjddd}tjtjdt d|¡gtjd}|  ¡\}}|  ¡}|j t |ƒdd|d t tt|d  ¡ d ¡ƒƒ}t tt|d  ¡ d ¡ƒƒ}|j||@d d dS)z;Confirm that issue21618 is fixed (may fail under valgrind).rórñròraK import os, resource, subprocess, sys, textwrap open_fds = set() # Add a bunch more fds to pass down. for _ in range(40): fd = os.open(os.devnull, os.O_RDONLY) open_fds.add(fd) # Leave a two pairs of low ones available for use by the # internal child error pipe and the stdout pipe. # We also leave 10 more open as some Python buildbots run into # "too many open files" errors during the test if we do not. for fd in sorted(open_fds)[:14]: os.close(fd) open_fds.remove(fd) for fd in open_fds: #self.addCleanup(os.close, fd) os.set_inheritable(fd, True) max_fd_open = max(open_fds) # Communicate the open_fds to the parent unittest.TestCase process. print(','.join(map(str, sorted(open_fds)))) sys.stdout.flush() rlim_cur, rlim_max = resource.getrlimit(resource.RLIMIT_NOFILE) try: # 29 is lower than the highest fds we are leaving open. resource.setrlimit(resource.RLIMIT_NOFILE, (29, rlim_max)) # Launch a new Python interpreter with our low fd rlim_cur that # inherits open fds above that limit. It then uses subprocess # with close_fds=True to get a report of open fds in the child. # An explicit list of fds to check is passed to fd_status.py as # letting fd_status rely on its default logic would miss the # fds above rlim_cur as it normally only checks up to that limit. subprocess.Popen( [sys.executable, '-c', textwrap.dedent(""" import subprocess, sys subprocess.Popen([sys.executable, %r] + [str(x) for x in range({max_fd})], close_fds=True).wait() """.format(max_fd=max_fd_open+1))], close_fds=False).wait() finally: resource.setrlimit(resource.RLIMIT_NOFILE, (rlim_cur, rlim_max)) rrdz(expected exactly two lines of output: %rr—rrõrzSome fds were left open.N)rrörr3rDrEr:r;r4r r"rFr"rQrÖr(rrÃr )rr÷r:r_Z unused_stderrZ output_linesZ opened_fdsr rrrÚ%test_close_fds_when_max_fd_is_lowered˜ s$ /Ñÿ0Ð2  ÿ ÿz:POSIXProcessTestCase.test_close_fds_when_max_fd_is_loweredrKrac Cs@tjddd}tƒ}tdƒD]Z}t ¡}| tj|d¡| tj|d¡t |dd¡t |dd¡|  |¡q|D]¾}t j t j |gt jd|fd}| ¡\}}ttt| d ¡ƒƒ} ||h} | || d ¡| | | @d ¡| t¡(} | t jtd |fd ¡Wdƒn1s0Y| dt| jƒ¡q|dS)NrórñròrarrTrrõzfd to be passed not passedzfd to be closed passedF)r0rzoverriding close_fds)rrörQrNr r,rmr8r Úupdaterr3rDrEr4r rÖr(rÃr]r Z assertWarnsrwrCrrkÚwarning) rr÷r…r.r„rr:r_r r Z to_be_closedÚcontextrrrÚ test_pass_fdsë s6   þ   ÿ þ(z"POSIXProcessTestCase.test_pass_fdsc Csätjddd}t ¡\}}| tj|¡| tj|¡t |d¡t |d¡||f}tj|g}|t t t |ƒƒ7}t j |t jd|d}| ¡\}}tt t| d¡ƒƒ} | | t|ƒd|¡| t |¡d¡| t |¡d¡dS) NrórñròTFrrõz output=%a)rrör r,rmr8r rDrErrÖrkrr3r4r rQr(rÃrFr²) rrêr´Znon_inheritablerr*r:r_r r„rrrÚtest_pass_fds_inheritable s$    þ z.POSIXProcessTestCase.test_pass_fds_inheritablec Cstjddd}g}tdƒD],}t tjtj¡}| tj|¡|  |¡qt  ¡\}}| tj|¡| tj|¡|  d|¡t j tj|g|d|d|dd|dt |d ¡}Wd ƒn1sÆ0Yd d „| d ¡Dƒ}| |hd£t|ƒBd|›¡d S)z7Regression test for https://bugs.python.org/issue32270.rórñròrdrrT)r0r1r2r0rríNcSsh|] }t|ƒ’qSr)r()r ÚnumrrrÚ @ r÷z@POSIXProcessTestCase.test_pass_fds_redirected..rõ>rrrdzoutput=)rrörNr rPr ÚO_RDWRrmr8rOr,Úinsertrr3rDrErÆrÃrFÚ frozenset) rr÷rr#rZstdout_rZstdout_wr_r„rrrÚtest_pass_fds_redirected+ s(     û*z-POSIXProcessTestCase.test_pass_fds_redirectedcCsJt tjd¡(}tjt||d}| ¡Wdƒn1s<0YdS)Núr+)r1r0©r6rPr r rr3rr©rZinoutr:rrrÚ%test_stdout_stdin_are_single_inout_fdE s ÿz:POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fdcCsJt tjd¡(}tjt||d}| ¡Wdƒn1s<0YdS)NrrrrrrrÚ&test_stdout_stderr_are_single_inout_fdK s ÿz;POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fdcCsJt tjd¡(}tjt||d}| ¡Wdƒn1s<0YdS)Nr)r2r0rrrrrÚ%test_stderr_stdin_are_single_inout_fdQ s ÿz:POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fdcCsRtjddd}tjtj|gtjtjd}| ¡\}}| d|j d|  d¡¡dS)Nzsigchild_ignore.pyrñròrrz6sigchild_ignore.py exited non-zero with this error: %srF) rrörr3rDrEr4r rFrrÇ)rZsigchild_ignorer:r1r2rrrÚtest_wait_when_sigchild_ignoredW sÿ ÿ  þz4POSIXProcessTestCase.test_wait_when_sigchild_ignoredc Cs‚t d¡}tjtjddgtjdd}|j}| |j ¡z<|  |  d¡d¡|  ||  |gggd¡d¡W| ¡n | ¡0dS) Nrrz$import sys;sys.stdout.write("apple")r)r1r<rüsapplg)rÚ import_modulerr3rDrEr4r1rmr8rFrÆr]rr)rrr:rÙrrrÚtest_select_unbufferedb s  ÿü  z+POSIXProcessTestCase.test_select_unbufferedcCs¦tjtjddgtjtjd}| |jj¡| |jj¡t |ƒ}|j }t   dt f¡d}Wdƒn1sn0YtrŠ| tj¡n| |dd„tjDƒ¡dS)Nrz import sys, time;time.sleep(0.2)rrcSsg|] }t|ƒ‘qSr©Úid©r Úorrrr‰ r÷zEPOSIXProcessTestCase.test_zombie_fast_process_del..)rr3rDrEr4rmr1r8r2r&ÚpidrÚcheck_warningsÚResourceWarningrrerr])rr:Úidentr)rrrÚtest_zombie_fast_process_dels s ÿü"z1POSIXProcessTestCase.test_zombie_fast_process_delc Cs\tjtjddgtjtjd}| |jj¡| |jj¡t |ƒ}|j }t   dt f¡d}Wdƒn1sn0Yt |tj¡tr˜| tj¡n| |dd„tjDƒ¡t d¡| t¡Dtjttjtjd}Wdƒn1sð0YWdƒn1s0Y| ttj|d¡tr@| tj¡n| |d d„tjDƒ¡dS) Nrzimport time;time.sleep(3)rrcSsg|] }t|ƒ‘qSrr%r'rrrr£ r÷zJPOSIXProcessTestCase.test_leak_fast_process_del_killed..r–rcSsg|] }t|ƒ‘qSrr%r'rrrr³ r÷)rr3rDrEr4rmr1r8r2r&r)rr*r+r r’r¹r¦rrerr]rr‚rNrSr¸Úwaitpidrw)rr:r,r)r}rrrÚ!test_leak_fast_process_del_killed‹ s8 ÿü"  þ>z6POSIXProcessTestCase.test_leak_fast_process_del_killedcsxtjddd}t d¡‰| tjˆ¡tjtj |gtj d‡fdd„d}|  ¡\}}t t t| d ¡ƒƒ}| ˆ|¡dS) NrórñròrTcs t dˆ¡Sr½)r r·r©rrrrh¿ r÷zCPOSIXProcessTestCase.test_close_fds_after_preexec..)r1r0rirõ)rrör r³rmr8rr3rDrEr4r rQrÖr(rÃrw)rr÷r:r_r r rr0rÚtest_close_fds_after_preexecµ s   þ z1POSIXProcessTestCase.test_close_fds_after_preexecc Csþddl}t ¡}zÚdd„}t ¡ddgddgfdgdddgfdgdgddgfdgdgddffD]z\}}}}| t¡B}| ||dd ||d d d d d d d ddddgdd |¡Wdƒn1s¾0Y| dt|j ƒ¡q`W|sút  ¡n|søt  ¡0dS)NrcSsdSrrrrrrrhÐ r÷z5POSIXProcessTestCase.test_fork_exec..r§sexeóenvsargTrr1rrdrŠrüFz takes exactly) rorzr{r}rNr•rrwrkrUr|) rroÚ gc_enabledÚfuncr*Zexe_listrÀÚenv_listr¥rrrÚtest_fork_execÆ s2ü ù" ÿz#POSIXProcessTestCase.test_fork_execcCsêddl}Gdd„dƒ}t ¡}z¸t ¡ddddd|d ƒ|d ƒffD]‚}|jtd  |¡d H}| d gd gd|ddgddddd d ddddddddd¡Wdƒn1sª0Y| dt |j ƒ¡qDW|sæt  ¡n|sät  ¡0dS)Nrc@s eZdZdZdd„Zdd„ZdS)zJPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check..BadIntTcSs ||_dSr)ré)rrérrrr–ô szSPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check..BadInt.__init__cSs|jrd|_|jSt‚dS)NF)Úfirstrér€rrrrÚ__int__ö szRPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check..BadInt.__int__N)r$r%r&r7r–r8rrrrÚBadIntò sr9)r1rdrŠrüra)rkrü)ééé*l)rarü)r3r©r©rurrdzfds_to_keep={}r—sfalseTr2r1rŠrür) rorzr{r}rNr€rHrr]rkrUr|)rror9r3rrWrrrÚ%test_fork_exec_sorted_fd_sanity_checkî s> úþ ù" ÿz:POSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_checkc Cszt t¡}|Xtj |d¡*}t|j_|  ¡|j  ¡Wdƒn1sN0YWdƒn1sl0YdS)Nr0) rr3rrr¯r°ÚBrokenPipeErrorr8rr Zassert_called_with©rr}Úmock_proc_stdinrrrÚ,test_communicate_BrokenPipeError_stdin_close s  zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_closec Csˆt t¡}|ftj |d¡8}t|j_|  d¡|j  d¡|j   ¡Wdƒn1s\0YWdƒn1sz0YdS)Nr0óstuff) rr3rrr¯r°r>rnrr Úassert_called_once_withr8r?rrrÚ,test_communicate_BrokenPipeError_stdin_write! s    zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_writec CsÄtjtjdgtjtjd}|’tj |d¡d}tt j dƒ8}t |j _ | ¡|j_| d¡|j  ¡Wdƒn1sz0YWdƒn1s˜0YWdƒn1s¶0YdS)Nú-hr§r0ÚwbrB)rr3rDrEr4rr¯r°rPr r r>r5rrâÚ return_valuer rC)rr}r@Zdev_nullrrrÚ,test_communicate_BrokenPipeError_stdin_flush+ s þ ÿ  zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flushc CsŽtjtjdgtjtjd}|\tj |d¡.}t|j _ |j dd|j   ¡Wdƒn1sb0YWdƒn1s€0YdS)NrEr§r0içrL) rr3rDrEr4rr¯r°r>r8rr rCr?rrrÚ9test_communicate_BrokenPipeError_stdin_close_with_timeout: s þ zNPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeoutNÚ W_STOPCODEzneed _testcapi.W_STOPCODEcCstt}t |¡}tj|jddt d¡}tj d|j|fd|  ¡}Wdƒn1sZ0Y|  |d¡dS)zATest wait() behavior when waitpid returns WIFSTOPPED; issue29335.r©rïrŠr)rGNéýÿÿÿ) rrr3rÚ wait_processr)Ú _testcapirJrr¯rrF)rr*r}ÚstatusrrrrÚ test_stoppedF s  &z!POSIXProcessTestCase.test_stoppedcCstt t¡}tj|jdd| |j¡t  d¡}|  t j ¡Wdƒn1sR0Y|  ¡| |j¡dS)NrrKzos.kill)rr3rrrMr)rerrr¯r£r¹r©Zassert_not_calledrã)rr}Z mock_killrrrÚtest_send_signal_raceW s   *z*POSIXProcessTestCase.test_send_signal_racecCsnt tjddg¡}|js"| ¡qtjj|ddd„d"d|_|  t j ¡Wdƒn1s`0YdS)Nrzexit(1)rfcSsdSrrrrrrrhv r÷z=POSIXProcessTestCase.test_send_signal_race2..)Únew) rr3rDrErrfrr¯r°r£r¹r©r9rrrÚtest_send_signal_race2m s  z+POSIXProcessTestCase.test_send_signal_race2cCsFtjtjddgtjd}z|jddWdStjy>Yq0qdS)Nrz+import os, time; os.close(1), time.sleep(2)rrKrL)rr3rDrEr4r rO©rr}rrrÚ1test_communicate_repeated_call_after_stdout_closez s ÿþ zFPOSIXProcessTestCase.test_communicate_repeated_call_after_stdout_close)nr$r%r&rrr r r rr3rrr¯rrr®rÏr r¯r¡r$r)rÔrÕr=r@rHrIrSrTrr[r]rarcrerkrprvrwr~rDrÓr„r‹r›r•r–r—r›r¡r r¢r¥r§rªr¬r¯r±r¶r¸rºr¼r¾r¿rÀrÁrÂrÃrÄrÑrÒrÓrÜràrärërðrûrrrWÚst_devrrZrequires_mac_verrrrrr r!r"r$r-r/r1Ú cpython_onlyr6r=rArDrHrIrNrPrQrSrUÚ __classcell__rrrrrÿqsê    ÿ  3  )  0 ÿ    % ÿ     ÿ -0,)0þ P  ! * ' )   þ  rÿzWindows specific testsc@sÂeZdZdd„Zdd„Zdd„Zdd„Zd d „Zej d d „ƒZ d d„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-S).ÚWin32ProcessTestCasecCs.d}d}t ¡}||_||_tjt|ddS)NrrŠrŒ)rÚ STARTUPINFOÚdwFlagsÚ wShowWindowrCr)rÚSTARTF_USESHOWWINDOWÚ SW_MAXIMIZErrrrÚtest_startupinfo‰ sÿz%Win32ProcessTestCase.test_startupinfocCs(d}d}tj||d}tjt|ddS)NrrŠ)r[r\rŒ)rrZrCr)rZSTARTF_USERSHOWWINDOWr^rrrrÚtest_startupinfo_keywords˜ sþÿz.Win32ProcessTestCase.test_startupinfo_keywordsc Csþt ¡}tj|_tj|_tdƒD]Ø}t}tt j dƒ^}tj ||tj |d}||  ¡Wdƒn1sl0Y| |jd¡Wdƒn1s˜0Y| |jtj¡| |j¡| |j¡| |j¡| |jtj¡| |jdgi¡q dS)Nrdr†)r1r2rrÚ handle_list)rrZr]r[ZSW_HIDEr\rNrrPr r r3rer rFrreZ hStdInputZ hStdOutputZ hStdErrorÚlpAttributeList)rrr#rZnullr}rrrÚtest_startupinfo_copy¨ s, ý&,ÿ   z*Win32ProcessTestCase.test_startupinfo_copycCs(d}tj d¡tjtjd|ddS)Néz' a DOS box should flash briefly ... z# -c "import time; time.sleep(0.25)"rŽ)rDr2rnrrCrE)rZCREATE_NEW_CONSOLErrrÚtest_creationflagsà s ÿþz'Win32ProcessTestCase.test_creationflagscCs$|jttjtjddgdd„ddS)Nrr@cSsdSr½rrrrrrhÐ r÷z8Win32ProcessTestCase.test_invalid_args..rnrrrrrr›Ë s  ÿýz&Win32ProcessTestCase.test_invalid_argscCsNGdd„dtƒ}| t¡ tjt|ƒdWdƒn1s@0YdS)Nc@seZdZdZdS)z4Win32ProcessTestCase.test_issue31471..BadEnvN)r$r%r&ÚkeysrrrrÚBadEnvÖ srgrŽ)ÚdictrNr•rr3r)rrgrrrÚtest_issue31471Ò s z$Win32ProcessTestCase.test_issue31471cCs&tjtjddgdd}| |d¡dS)Nrr@T)r0rArBrGrrrrÛ s  ÿþz#Win32ProcessTestCase.test_close_fdsc Csîddl}t ¡}| tj|d¡| tj|d¡g}|D] }t |d¡| | |¡¡q.popen_via_context_manager)r|)rr€rrrÚ.test_context_manager_keyboardinterrupt_no_kill¿ sz8MiscTests.test_context_manager_keyboardinterrupt_no_killc Cs”| t d¡d¡| t d¡d¡d}zRt ¡}tj |d¡}t t rLdnd|¡\}}|  |d¡W|durt  |¡n|durŽt  |¡0dS)Nz echo xyzzyÚxyzzy)rr‚Zfooztype zcat r) rFrÚ getoutputÚgetstatusoutputrkrMr r¯r°rr#Úrmdir)rÚdirrZrOr_rrrÚtest_getoutputÅ s  ÿÿ ÿzMiscTests.test_getoutputcCsnhd£}ttjƒ}tƒ}ddl}tj ¡D].\}}| d¡r>q*t||jfƒrNq*|  |¡q*|  |||¡dS)z*Ensure that __all__ is populated properly.>r5rbrøÚHandlerNr#) rQrÚ__all__rËÚ__dict__Úitemsr r9Ú ModuleTyper rF)rZintentionally_excludedZexportedZpossible_exportsrËrZrérrrÚ test__all__Ø s   zMiscTests.test__all__N)r$r%r&rr3rxrr¯r°r|r~rrr‡rrrrrrvƒ s +rvÚ PollSelectorz!Test needs selectors.PollSelectorc@seZdZdd„Zdd„ZdS)ÚProcessTestCaseNoPollcCstj|_tjt_t |¡dSr)rÚ_PopenSelectorÚ orig_selectorÚ selectorsÚSelectSelectorr.rrrrrrê szProcessTestCaseNoPoll.setUpcCs|jt_t |¡dSr)r‘rrr.r"rrrrr"ï szProcessTestCaseNoPoll.tearDownNr#rrrrrç srzWindows-specific testscsPeZdZ‡fdd„Z‡fdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z ‡Z S)ÚCommandsWithSpacescs>tƒ ¡t dd¡\}}| ¡|_t |d¡t |¡dS)Nz.pyzte stsVimport sys;sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv]))) rrrkrŸr_r‰r rnr8)rrÙr‰rrrr÷ s    zCommandsWithSpaces.setUpcst |j¡tƒ ¡dSr)r r r‰rr"rrrrr"s zCommandsWithSpaces.tearDowncOs`tj|d<tj|i|¤Ž}|.| |j ¡ d¡d|j¡Wdƒn1sR0YdS)Nr1Úmbcsz2 [%r, 'ab cd'])rr4r3rFr1rÆrÇr‰)rr*r+r:rrrÚ with_spacess þzCommandsWithSpaces.with_spacescCs |jdtj|jdfdddS)Nú"%s" "%s" "%s"úab cdrrª©r–rDrEr‰rrrrÚtest_shell_string_with_spaces s ÿÿz0CommandsWithSpaces.test_shell_string_with_spacescCs|jtj|jdgdddS)Nr˜rrªr™rrrrÚtest_shell_sequence_with_spacessz2CommandsWithSpaces.test_shell_sequence_with_spacescCs| dtj|jdf¡dS)Nr—r˜r™rrrrÚtest_noshell_string_with_spacessÿz2CommandsWithSpaces.test_noshell_string_with_spacescCs| tj|jdg¡dS)Nr˜r™rrrrÚ!test_noshell_sequence_with_spacessz4CommandsWithSpaces.test_noshell_sequence_with_spaces) r$r%r&rr"r–ršr›rœrrXrrrrr”ô s  r”c@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) ÚContextManagerTestscCs€tjtjddgtjtjd4}| |j ¡d¡| |j ¡d¡Wdƒn1sV0Y|  |jj ¡|  |jj ¡dS)NrzAimport sys;sys.stdout.write('stdout');sys.stderr.write('stderr');rsstdoutsstderr) rr3rDrEr4rFr1rÆr2r&r'rTrrrÚ test_pipe"s ÿû0zContextManagerTests.test_pipecCsDt tjddg¡}Wdƒn1s(0Y| |jd¡dS)Nrzimport sys; sys.exit(100)éd)rr3rDrErFrrTrrrrÝ/s  ÿz#ContextManagerTests.test_returncodecCsTtjtjddgtjd(}| d¡| |jd¡Wdƒn1sF0YdS)Nrz2import sys;sys.exit(sys.stdin.read() == 'context')riscontextrrørTrrrr6s ÿý z*ContextManagerTests.test_communicate_stdinc Csb| t¡Dtjttjtjd}Wdƒn1s60YWdƒn1sT0YdS)Nr)rNr·rr3r¸r4rTrrrr›>s þz%ContextManagerTests.test_invalid_argscCsrtjttjtjdd}| ¡}|j dtj¡|  |j ¡|  t |j ddd¡| |j d¡| |jj¡dS)z9Broken pipe error should not prevent wait() (Issue 21619)rd)r0r<r£Nr)rr3rr4rr-Ú __enter__r0rnrerrNrSÚ__exit__rFr&r'rTrrrÚtest_broken_pipe_cleanupEsþ z,ContextManagerTests.test_broken_pipe_cleanupN)r$r%r&rŸrÝrr›r£rrrrrž s  ržÚ__main__)?r®rrårrrDr¹r6rÝr rTrkrrõrËr’rÒrr r‡rzr:rOr«Z test.supportrrNr|r5røZPGOrürÓrr4r¸rÓÚNotADirectoryErrorr8r·rErrZTestCaserÚ Exceptionr'r3r(r.r×rþrÏrÿrÔrYrvrÕrr”ržr$ÚmainrrrrÚs²               Y0  }d ÿ +6