a zeb@sddlZddlmZddlmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZz ddlZWneydZYn0z ddlZWneydZYn0z ddlZWney:dZYn0ejrNedej dkZ!e!rddZ"ndZ"d Z#e$e%e&fZ'ej(d d fa)d d Z*Gdddej+Z,Gddde-Z.Gdddej/Z0Gddde,Z1Gddde,Z2ddZ3e4e!dGddde,Z5e6e!dGddde,Z7Gd d!d!ej+Z8e6e9ed"d#Gd$d%d%e1Z:e6e!d&Gd'd(d(e,Z;Gd)d*d*e,ZdS),N)mock)support)FakePathztest is not helpful for PGOwin32z@import msvcrt; msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY);)Znonexisting_i_hope-cpasscCs@td}|durdSt|tjrs rc@seZdZddZddZdS) BaseTestCasecCs tdSN)r reap_childrenselfrrrsetUpIszBaseTestCase.setUpcCsBts.tjD] }|q t|tjd|tdS)Nzsubprocess._active not empty) mswindowsr_activewait_cleanup assertFalseZ doCleanupsrr)rinstrrrtearDownNs  zBaseTestCase.tearDownN__name__ __module__ __qualname__rr"rrrrrHsrc@s eZdZdS)PopenTestExceptionN)r$r%r&rrrrr'[sr'c@seZdZddZdS)PopenExecuteChildRaisescOs tddS)NzForced Exception for Test)r'rargskwargsrrr_execute_childcsz&PopenExecuteChildRaises._execute_childN)r$r%r&r,rrrrr(_sr(c@sBeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zee d7d8d9Z!ee d7d:d;Z"ee d7dd?Z$d@dAZ%dBdCZ&dDdEZ'dFdGZ(dHdIZ)ee dJdKdLZ*ee dJdMdNZ+dOdPZ,ee-j.e-j/kdQdRdSZ0ee-j.e-j/kdQee12dTdUdVZ3dWdXZ4dYdZZ5d[d\Z6d]d^Z7d_d`Z8dadbZ9dcddZ:dedfZ;dgdhZdmdnZ?dodpZ@dqdrZAdsdtZBdudvZCdwdxZDee-jEdykdzee1Fd{d|kd}d~dZGddZHddZIddZJddZKddZLddZMddZNddZOddZPddZQddZRddZSddZTddZUddZVddZWddZXddZYddZZddZ[ddZ\ddZ]ddZ^ddZ_ddZ`ddZaddZbddZcddZdddZeddZfddZgddZhddÄZiddńZjddDŽZkddɄZldd˄Zmeneoepd̃d͡eneoeqd΃dϡeneoeqdЃdѡddӄZreneqjstdequdաddׄZvee dءddڄZwee dءdd܄ZxddބZydS)ProcessTestCasecCstjttjtjtjd}zZ||jtj||jtj||j tjW|j |j |j | n(|j |j |j | 0dS)Nstdinstdoutstderr) rPopenrPIPEassertIsInstancer/ioBufferedIOBaser0r1closerrprrrtest_io_buffered_by_defaultis       z+ProcessTestCase.test_io_buffered_by_defaultcCstjttjtjtjdd}zZ||jtj||jtj||j tjW|j |j |j | n(|j |j |j | 0dS)Nr)r/r0r1bufsize) rr2rr3r4r/r5 RawIOBaser0r1r7rr8rrrtest_io_unbuffered_worksws       z(ProcessTestCase.test_io_unbuffered_workscCs"ttjddg}||ddSNrimport sys; sys.exit(47)/rcallsys executable assertEqualrrcrrr test_call_seqs zProcessTestCase.test_call_seqcCs"|jtjtjtjddgdddS)Nrwhile True: pass皙?timeout) assertRaisesrTimeoutExpiredrBrCrDrrrrtest_call_timeouts  z!ProcessTestCase.test_call_timeoutcCstt}||ddSNr)r check_callrrErFrrrtest_check_call_zeros z$ProcessTestCase.test_check_call_zerocCsR|tj"}ttjddgWdn1s40Y||jjddSr>) rMrCalledProcessErrorrQrCrDrE exceptionrrcrrrtest_check_call_nonzeros  $z'ProcessTestCase.test_check_call_nonzerocCs"ttjddg}|d|dS)Nr print('BDFL')BDFLr check_outputrCrDassertInroutputrrrtest_check_outputs z!ProcessTestCase.test_check_outputcCsR|tj"}ttjddgWdn1s40Y||jjddS)Nrzimport sys; sys.exit(5)) rMrrSr[rCrDrErTrrUrrrtest_check_output_nonzeros  "z)ProcessTestCase.test_check_output_nonzerocCs(tjtjddgtjd}|d|dS)Nr$import sys; sys.stderr.write('BDFL')r1rY)rr[rCrDSTDOUTr\r]rrrtest_check_output_stderrs  z(ProcessTestCase.test_check_output_stderrcCsNt}||j|d|dtjtj ddg|d}| d|dS)Npearrr6import sys; sys.stdout.write(sys.stdin.read().upper())r/PEAR) tempfile TemporaryFile addCleanupr7writeseekrr[rCrDr\)rtfr^rrrtest_check_output_stdin_args   z+ProcessTestCase.test_check_output_stdin_argcCs&tjtjddgdd}|d|dS)NrrgrfinputrirZr]rrrtest_check_output_input_argsz+ProcessTestCase.test_check_output_input_argcCs&tjtjddgdd}|d|dS)Nr3import sys; print('XX' if sys.stdin.read() else '')rqsXXrr[rCrD assertNotInr]rrrtest_check_output_input_nonesz,ProcessTestCase.test_check_output_input_nonecCs(tjtjddgddd}|d|dS)NrrtT)rrtextXXrur]rrr!test_check_output_input_none_textsz1ProcessTestCase.test_check_output_input_none_textcCs(tjtjddgddd}|d|dS)NrrtT)rruniversal_newlinesryrur]rrr/test_check_output_input_none_universal_newlinessz?ProcessTestCase.test_check_output_input_none_universal_newlinescCsd|t2}tjtjddgtjd}|dWdn1sB0Y|d|j j ddS)Nrprint('will not be run')r0z-Expected ValueError when stdout arg supplied.r0r) rM ValueErrorrr[rCrDr0failr\rTr*rrVr^rrrtest_check_output_stdout_args  (z,ProcessTestCase.test_check_output_stdout_argcCst}||j|d|d|t2}tj t j ddg|dd}| dWdn1sj0Y| d|jjd| d |jjddS) Nrfrrr}harer/rr7Expected ValueError when stdin and input args supplied.r/rr)rjrkrlr7rmrnrMrrr[rCrDrr\rTr*rrorVr^rrr&test_check_output_stdin_with_input_args     (z6ProcessTestCase.test_check_output_stdin_with_input_argcCs`|tj0}tjtjddgdd}|dWdn1sB0Y||jj ddS)NrMimport sys, time sys.stdout.write('BDFL') sys.stdout.flush() time.sleep(3600)rKzExpected TimeoutExpired.rY) rMrrNr[rCrDrrErTr^rrrrtest_check_output_timeouts (z)ProcessTestCase.test_check_output_timeoutcCs8tj}d|d<tjtjddg|d}||ddS)NbananaFRUITrz5import sys, os;sys.exit(os.getenv("FRUIT")=="banana")env)r environcopyrrBrCrDrE)rnewenvrGrrrtest_call_kwargss  z ProcessTestCase.test_call_kwargscCs~tR}|jttjddtjjjj}dg|d}|jttjg|RWdn1s`0Y| | ddS)Nr)Zinvalid_arg_namerr) rZcaptured_stderrrM TypeErrorrr2__init____code__ co_argcountrEgetvalue)rsZargcountZ too_many_argsrrrtest_invalid_argss   4z!ProcessTestCase.test_invalid_argscCsRtjtjddgtjtjd}||jj||jj| | |j ddS)Nrprint("banana")r0r1) rr2rCrDr3rlr0r7r1rrEr/r8rrrtest_stdin_noneszProcessTestCase.test_stdin_nonecCsld}tjtjd|gtjtjd}||jj||jj| \}}| |j d|| | ddS)Nzimport sys; from subprocess import Popen, PIPE;p = Popen([sys.executable, "-c", "print('test_stdout_none')"], stdin=PIPE, stderr=PIPE);p.wait(); assert p.stdout is None;rrrstest_stdout_none rr2rCrDr3rlr0r7r1 communicaterErrstriprcoder9outerrrrrtest_stdout_none!s  z ProcessTestCase.test_stdout_nonecCsRtjtjddgtjtjd}||jj||jj| | |j ddS)Nrrr/r0) rr2rCrDr3rlr0r7r/rrEr1r8rrrtest_stderr_none8sz ProcessTestCase.test_stderr_nonecKs6|dg}tj|fi|}||d|jdSNr?r@)rr2rrEr)rpre_argsr+r*r9rrr_assert_pythonAs zProcessTestCase._assert_pythoncCs0tjtjtjd}|j|dgtjddSN doesnotexistrrD)r pathjoindirnamerCrDrrrrrrtest_executableIszProcessTestCase.test_executablecCs6tjtjtjd}|j|dgttjddSr)r rrrrCrDrfsencoderrrrtest_bytes_executableTs   z%ProcessTestCase.test_bytes_executablecCs4tjtjtjd}|j|dgttjddSr)r rrrrCrDrrrrrrtest_pathlike_executableZs  z(ProcessTestCase.test_pathlike_executablecCs0tjdg}|||jt|j|tdddS)Nrrr)rCrDrrMNONEXISTING_ERRORSNONEXISTING_CMD)rrrrr test_executable_takes_precedence`s   z0ProcessTestCase.test_executable_takes_precedencez"executable argument replaces shellcCs|jgtjdddSNT)rDshell)rrCrDrrrrtest_executable_replaces_shelljsz.ProcessTestCase.test_executable_replaces_shellcCs|jgttjdddSr)rr rrCrDrrrr$test_bytes_executable_replaces_shellpsz4ProcessTestCase.test_bytes_executable_replaces_shellcCs|jgttjdddSr)rrrCrDrrrr'test_pathlike_executable_replaces_shellusz7ProcessTestCase.test_pathlike_executable_replaces_shellcCs6t|tWdS1s(0YdSr)rZ change_cwdr getcwd)rcwdrrr_normalize_cwd{s zProcessTestCase._normalize_cwdcCstjtj}tj|Sr)r rrealpathrCrDsplit)rZ python_pathrrr_split_python_pathsz"ProcessTestCase._split_python_pathcKsltj|ddgfdtji|}||jj||d|jt j j }|||||j dS)Nrzcimport os, sys; buf = sys.stdout.buffer; buf.write(os.getcwd().encode()); buf.flush(); sys.exit(47)r0r@)rr2r3rlr0r7rrErr rnormcasereaddecode)rZ expected_cwdZ python_argr+r9rrrr _assert_cwds zProcessTestCase._assert_cwdcCs(t}||}|j|tj|ddSNr)rj gettempdirrrrCrDrtemp_dirrrrtest_cwds zProcessTestCase.test_cwdcCs.t}||}|j|tjt|ddSr)rjrrrrCrDr rrrrrtest_cwd_with_bytess z#ProcessTestCase.test_cwd_with_bytescCs,t}||}|j|tjt|ddSr)rjrrrrCrDrrrrrtest_cwd_with_pathlikes z&ProcessTestCase.test_cwd_with_pathlikez"pending resolution of issue #15533cCs|\}}tjtj|}tR}|tt j |g|jtt j |g|d| |}|j |||dWdn1s|0YdSr rr rrcurdirrZtemp_cwdrMFileNotFoundErrorrr2rr)r python_dir python_base rel_python wrong_dirrrrtest_cwd_with_relative_args     z*ProcessTestCase.test_cwd_with_relative_argcCs|\}}tjtj|}d}tZ}|jtt j |g|d|jtt j |g||d| |}|j ||||dWdn1s0YdS)NsomethingyoudonthaverrDrr)rrrrZ doesntexistrrrr!test_cwd_with_relative_executables      z1ProcessTestCase.test_cwd_with_relative_executablecCs|\}}tj||}tjtj|}t@}|jtt j |g|d| |}|j |||dWdn1sx0YdSr) rr rrrrrrMrrr2rr)rrrZ abs_pythonrrrrrtest_cwd_with_absolute_args    z*ProcessTestCase.test_cwd_with_absolute_argzTest is not venv-compatiblecCs.|\}}||}|j|dtj|ddS)Nrr)rrrrCrD)rrrrrrtest_executable_with_cwds   z(ProcessTestCase.test_executable_with_cwdz#need an installed Python. See #7774cCs|jtdtjddS)Nrr)rr rrCrDrrrrtest_executable_without_cwds z+ProcessTestCase.test_executable_without_cwdcCsHtjtjddgtjd}|jd|j|| |j ddS)Nr0import sys; sys.exit(sys.stdin.read() == "pear")rhrfr) rr2rCrDr3r/rmr7rrErr8rrrtest_stdin_pipes   zProcessTestCase.test_stdin_pipecCsft}||j|}t|dt|ddtj t j ddg|d}| | |jddSNrfrrrrhr)rjrkrlr7filenor rmlseekrr2rCrDrrErrrodr9rrrtest_stdin_filedess   z"ProcessTestCase.test_stdin_filedescCsXt}||j|d|dtjtj ddg|d}| | |j ddSr) rjrkrlr7rmrnrr2rCrDrrErrror9rrrtest_stdin_fileobjs    z"ProcessTestCase.test_stdin_fileobjcCsRtjtjddgtjd}|"||jdWdn1sD0YdS)Nr&import sys; sys.stdout.write("orange")r~orangerr2rCrDr3rEr0rr8rrrtest_stdout_pipes z ProcessTestCase.test_stdout_pipecCs`t}||j|}tjtjddg|d}| t |dd| t |dddS)Nrrr~rrrjrkrlr7rrr2rCrDrr rrErrrrrtest_stdout_filedess  z#ProcessTestCase.test_stdout_filedescCsPt}||jtjtjddg|d}|| d| | ddS)Nrrr~rr rjrkrlr7rr2rCrDrrnrErrrrrtest_stdout_fileobj&s   z#ProcessTestCase.test_stdout_fileobjcCsRtjtjddgtjd}|"||jdWdn1sD0YdS)Nr*import sys; sys.stderr.write("strawberry")rc strawberry)rr2rCrDr3rEr1rr8rrrtest_stderr_pipe1s z ProcessTestCase.test_stderr_pipecCs`t}||j|}tjtjddg|d}| t |dd| t |dddS)Nrrrcrrrrrrrrtest_stderr_filedes9s  z#ProcessTestCase.test_stderr_filedescCsPt}||jtjtjddg|d}|| d| | ddS)Nrrrcrrrrrrrtest_stderr_fileobjEs   z#ProcessTestCase.test_stderr_fileobjcCsRtjtjddgtjtjd}|\}}||d||d||jddS)Nrzimport sys, subprocess;rc = subprocess.call([sys.executable, "-c", "import sys;" "sys.stderr.write('42')"], stderr=subprocess.STDOUT);sys.exit(rc)rs42rrr2rCrDr3rrErrr9r0r1rrr,test_stderr_redirect_with_no_stdout_redirectPs    z.is_env_var_to_ignorerz)import os; print(list(os.environ.keys()))rcsg|]}|s|qSrr).0kr rr sz2ProcessTestCase.test_empty_env..) rr2rCrDr3revalstripr4listrE)rr9r0r1Zchild_env_namesrrrtest_empty_envs    zProcessTestCase.test_empty_envcCstjd}|t t|ddgWdn1s:0Y|t"ttjddgWdn1sv0YdS)Nrrzpass#)rCrDrMrrr2)rcmdrrrtest_invalid_cmds   . z ProcessTestCase.test_invalid_cmdcCsHtj}d|d<|ttjt|dWdn1s@0Ytj}d|d<|ttjt|dWdn1s0Ytj}d|d<|ttjt|dWdn1s0Ytj}d|d<tjtj d d gtj |d (}| \}}| |d Wdn1s:0YdS) NZcabbagezFRUITVEGETABLErzorangeVEGETABLE=cabbagerZlemonz FRUIT=ORANGEz orange=lemonrz3import sys, os;sys.stdout.write(os.getenv("FRUIT"))rs orange=lemon) r rrrMrrr2rrCrDr3rrErrrrtest_invalid_envs.  ,  ,  ,   z ProcessTestCase.test_invalid_envcCs4tjtjddgtjd}|d||jddS)Nrz/import sys;sys.exit(sys.stdin.read() == "pear")rhrfrrr8rrrtest_communicate_stdins  z&ProcessTestCase.test_communicate_stdincCs@tjtjddgtjd}|\}}||d||ddS)Nrz)import sys; sys.stdout.write("pineapple")r~ pineapplerr2rCrDr3rrErrrrtest_communicate_stdouts   z'ProcessTestCase.test_communicate_stdoutcCs@tjtjddgtjd}|\}}||d||ddS)Nrz)import sys; sys.stderr.write("pineapple")rcrrrrrrtest_communicate_stderr s   z'ProcessTestCase.test_communicate_stderrcCsttjtjddgtjtjtjd}||jj||jj||j j| d\}}| |d| |ddS)NrzNimport sys,os;sys.stderr.write("pineapple");sys.stdout.write(sys.stdin.read())r.bananar) rr2rCrDr3rlr0r7r1r/rrErrrrtest_communicates  z ProcessTestCase.test_communicatecCsdtjtjddgdtjtjtjd}|jtj|jddd|\}}||d|| ddS) 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{r/r0r1rg333333?rKspineapple pear ) rr2rCrDr3rMrNrrEencoderrrrtest_communicate_timeout#s    z(ProcessTestCase.test_communicate_timeoutcCsLtjtjddgtjd}|jtj|jdd|\}}|t |ddS)Nrzimport 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));r~g?rKi) rr2rCrDr3rMrNrrElen)rr9r0_rrr%test_communicate_timeout_large_output6s    z5ProcessTestCase.test_communicate_timeout_large_outputcCsdD]}dD]}dD]}i}|r*tj|d<|r8tj|d<|rFtj|d<|sLqtjtfi|}||jdur~||jj|jdur||jj|j dur||j jqq qdS)NFTr/r0r1) rr3r2rrr/ assertTrueclosedr0r1)rZ stdin_pipeZ stdout_pipeZ stderr_pipeoptionsr9rrrtest_communicate_pipe_fd_leakGs(      z-ProcessTestCase.test_communicate_pipe_fd_leakcCs:ttjddg}|\}}||d||ddS)Nrr?)rr2rCrDrrErrrrtest_communicate_returns]s    z(ProcessTestCase.test_communicate_returnscCst\}}t|t|tjtjddtjgtj tj tj d}| |j j| |j j| |j jdtj}||\}}|||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 piper7rr2rCrDr PIPE_MAX_SIZEr3rlr0r1r/rrE)rxyr9Zstring_to_writer0r1rrrtest_communicate_pipe_bufes$      z)ProcessTestCase.test_communicate_pipe_bufcCstjtjddgtjtjtjd}||jj||jj||j j|j d| d\}}| |d| |ddS)Nrz0import sys,os;sys.stdout.write(sys.stdin.read())r.rssplits bananasplitr) rr2rCrDr3rlr0r7r1r/rmrrErrrrtest_writes_before_communicate|s   z.ProcessTestCase.test_writes_before_communicatec Cstjddtdg}dD]}tj|fidtjdtj|di}||jd|j| |j d|jd |j | |j j | |j d | |j d d | |j d Wdq1s0YqdS) Nrimport 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{rxr/r0Tzline1 zline3 zline2 zline4 line5 line6 line7 line8)rCrD SETBINARYrr2r3r/rmflushrEr0readliner7rlr)rr*Z extra_kwargr9rrr test_universal_newlines_and_texts4      z0ProcessTestCase.test_universal_newlines_and_textcCs^tjtjddtdgtjtjdd}||jj||j j| \}}| |ddS)Nrr1zbuf = 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)r1r0r{z#line2 line4 line5 line6 line7 line8) rr2rCrDr3r3rlr0r7r1rrErrrr#test_universal_newlines_communicates  z3ProcessTestCase.test_universal_newlines_communicatecCsHtjtjddttdgtjdd}|d\}}| |j ddS)Nrr1a s = sys.stdin.readline() assert s == "line1\n", repr(s) s = sys.stdin.read() assert s == "line3\n", repr(s) r)r/r{ line1 line3 r) rr2rCrDr3textwrapdedentr3rrErrrrr)test_universal_newlines_communicate_stdins  z9ProcessTestCase.test_universal_newlines_communicate_stdincCs0tjttjtjdd}|||jddS)NT)r/r0r{r)rr2rr3rrErr8rrr.test_universal_newlines_communicate_input_nonesz>ProcessTestCase.test_universal_newlines_communicate_input_nonecCstjtjddttdgtjtjtjdd}||j j ||j j | d\}}| |jd| d|||d dS) Nrr1a 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)r/r1r0r{r8rzline1 line2 line3 line4 line5 zeline2 eline6 eline7 )rr2rCrDr3r9r:r3rlr0r7r1rrErr%r rrrr7test_universal_newlines_communicate_stdin_stdout_stderrs   zGProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderrcCsTdD]J}d|}tjd|g}tj|tjtj|d}|jdd\}}||dqdS)N)zutf-16z utf-32-bez@import sys; sys.stdout.buffer.write('1\r\n2\r3\n4'.encode('%s'))r)r/r0encodingrrqz1 2 3 4)rCrDrr2r3rrE)rr>rr*popenr0r1rrr-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]')rutf-8)r/r0r>errorsrrqz[{}])rCrDrr2r3rrEformat)rrFexpectedrr*r?r0r1rrrtest_communicate_errorss  z'ProcessTestCase.test_communicate_errorsc CsXts d}nd}g}t}zt|D]t}z.tj|tj}| t |tj tj BWq&t y}z(|jtjkrvWYd}~qWYd}~q&d}~00q&|d|tdD]}t|qtdD]>}tjtjddgtjtjtjd}|d d }||d qW|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)rrjmkdtempranger rrrZTESTFNappendopenO_WRONLYO_CREATOSErrorerrnoZEMFILEskipTestr7poprr2rCrDr3rrEr rmtree) rZ max_handleshandlestmpdiriZtmpfileer9datahrrrtest_no_leaking-sF  &    zProcessTestCase.test_no_leakingcCs|tgdd|tgdd|tgdd|tgdd|tgd d |tgd d |tgd d|tddgddS)N)za b crrZz "a b c" d e)ab"c\rz ab\"c \ d)r^z \rz ab\"c " \\" d)za\\\bzde fgr\za\\\b "de fg" h)za\"brVrz a\\\"b c d)za\\b crrZz "a\\b c" d e)za\\b\ crrZz "a\\b\ c" d eabrzab "")rEr list2cmdlinerrrrtest_list2cmdlineTs0z!ProcessTestCase.test_list2cmdlinecCsbtjtjddgtjd}||jj|| t |j d| || ddS)Nrzimport os; os.read(0, 1)rhAr)rr2rCrDr3rlr/r7 assertIsNonepollr rmrrrEr8rrr test_pollfs zProcessTestCase.test_pollcCs.tt}||d||ddSrPrr2rrErr8rrr test_waitqs zProcessTestCase.test_waitcCsvttjddg}|tj}|jddWdn1s@0Y|dt|j | |jt j dddS)Nrzimport time; time.sleep(0.3)-C6?rKz0.0001r) rr2rCrDrMrNrr\strrTrEr SHORT_TIMEOUT)rr9rVrrrtest_wait_timeoutws*z!ProcessTestCase.test_wait_timeoutcCs:|tttdWdn1s,0YdS)Nr)rMrrr2rrrrrtest_invalid_bufsizes z$ProcessTestCase.test_invalid_bufsizecCs>ttd}||dtjtdd}||ddS)Nr)r;rgr8rrrtest_bufsize_is_nones z$ProcessTestCase.test_bufsize_is_nonec Cstjtjddgtjtjtjd|d}|j|t |j |j }t 2z|j WntyvYn0Wdn1s0Yd|_Wdn1s0Y||jd|||dS)NrzDimport sys;sys.stdout.write(sys.stdin.readline());sys.stdout.flush()r)r/r0r1r;r{r)rr2rCrDr3rr/rmr r7rr0r5rSuppressCrashReportrRrEr)rlinerHr{r9Z read_linerrr_test_bufsize_equal_ones&    $$z'ProcessTestCase._test_bufsize_equal_onecCsd}|j||dddS)Nzline Tr{)rqrrprrr test_bufsize_equal_one_text_modesz0ProcessTestCase.test_bufsize_equal_one_text_modecCsNdtj}|td |j|dddWdn1s@0YdS)Nslinezline bufferingrFrr)r lineseprZassertWarnsRegexRuntimeWarningrqrsrrr"test_bufsize_equal_one_binary_modesz2ProcessTestCase.test_bufsize_equal_one_binary_modec CsPtdD]B}|t$tjttjtjdWdq1s@0YqdS)Nrr)rMrMrrr2rr3)rrYrrrtest_leaking_fds_on_errors   z)ProcessTestCase.test_leaking_fds_on_errorc Cszddl}|jWn ttfy2|dYn0tdtd}tj d|g}t j |t j dd}|| d}Wdn1s0Y||d ||jddS) 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)r1r{rr)msvcrtZCrtSetReportModeAttributeError ImportErrorrTr9r:rrCrDrr2r3rrEr)rryrrprocr1rrrtest_nonexisting_with_pipess"   * z+ProcessTestCase.test_nonexisting_with_pipescs*gfdd}tj|d}|z|t(tjttjtjtjdWdn1s^0YW| d}D]<}zt |Wqzt y}z|}WYd}~qzd}~00qz|dur|n`| d}D]>}zt |Wqt y}z|}WYd}~qd}~00q|dur$|0dS)Ncs*tdD]}ttdqdS)NgMbP?)rMextendr r+timesleep)rYfdsrropen_fdss z.open_fds)targetr.) threadingThreadstartrMEnvironmentErrorrr2rr3rr r7rR)rrtexcfdrZrrrtest_double_close_on_errors:   & z*ProcessTestCase.test_double_close_on_errorcsttjddg|jdgfdd}td|}|t rPd}nd}j t j d|jj|d d  |jj|d d | |d d |fd|fgdS)Nrzimport time; time.sleep(12)csNdfdjfdjfdS)Nthread-start-poll-resultthread-after-kill-and-waitthread-after-second-wait)rNrekillrrrr|resultsrrkill_proc_timer_thread s zDProcessTestCase.test_threadsafe_wait..kill_proc_timer_thread皙?rirKz*unexpected result in wait from main threadmsgz&unexpected result in second main wait.)rNrr)rr2rCrDrErrTimerrrrrrkr)rrrZexpected_errorcoderrrtest_threadsafe_waits4    z$ProcessTestCase.test_threadsafe_waitcCs6dd}ttjd|g}||dt|dS)N;)zimport subprocess, syszJretcode = subprocess.call([sys.executable, '-c', 'print("Hello World!")'])zassert retcode == 0rs Hello World!)rrr[rCrDr%r ascii)rrr^rrrtest_issue87806s zProcessTestCase.test_issue8780cCst\}}t\}}t\}}ztjdg|||dWnNtyt|t|t|t|t|t|Yn0|tj ||tj ||tj |dS)N*r.) rjmkstemprr2rRr r7remover rexists)rZifhandleZifnameZofhandleZofnameZefhandleZefnamerrr test_handles_closed_on_exceptionAs"           z0ProcessTestCase.test_handles_closed_on_exceptioncCsTtjttjtjtjd}||jj||jj||jj| dddS)Nr.x) rr2rr3rlr0r7r1r/rr8rrrtest_communicate_epipeUsz&ProcessTestCase.test_communicate_epipec Cstd}|jj}dddgdddfgddddf|dd d |d fg}tjjtj d F|D]0\}}}}tj ||d }||_ | t ||q^Wdn1s0YdS)Nz my-tool.py)lsT{z#)daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTrzPrFz&)rz --my-optsrzPzr,r) pathlibPath __class__r$unittestrpatchobjectrr2rrErepr) rZpath_cmdZ pathlib_clsZcasesrrrZsxr9rrr test_repr`s    zProcessTestCase.test_reprcCs8tjttjd}||jj||dddS)Nrhrr) rr2rr3rlr/r7rrr8rrr!test_communicate_epipe_only_stdinss z1ProcessTestCase.test_communicate_epipe_only_stdinSIGUSR1zRequires signal.SIGUSR1rzRequires os.killgetppidzRequires os.getppidc Csdd}ttj|}|tjtj|tjddg}dD]H}|tji}tj|fi|}|Wdq81sv0Yq8dS)NcSsdSrr)signumframerrrhandlersz7ProcessTestCase.test_communicate_eintr..handlerrz7import os, signal;os.kill(os.getppid(), signal.SIGUSR1)r) signalrrlrCrDrr3r2r)rr old_handlerr*streamkwprocessrrrtest_communicate_eintr{s z&ProcessTestCase.test_communicate_eintr /proc/%d/fdzLinux specificcCspdt}t|}|t&tttjtjtjdWdn1sL0Yt|}| ||dS)Nrr.) r getpidlistdirrMr'r(rrr3rE)rZ fd_directoryZfds_before_popenZfds_after_exceptionrrr!test_failed_child_execute_fd_leaks   $ z1ProcessTestCase.test_failed_child_execute_fd_leakz+behavior currently not supported on WindowscCsL|t}tgdWdn1s.0Y||jjddS)N)/opt/nonexistent_binarywithZsomer*r)rMrrrBrErTfilenamerUrrr%test_file_not_found_includes_filenames ,z5ProcessTestCase.test_file_not_found_includes_filenamecCsP|t"}tjddgddWdn1s20Y||jjddS)Nexit0z/some/nonexistent/directoryr)rMrrr2rErTrrUrrr test_file_not_found_with_bad_cwds 0z0ProcessTestCase.test_file_not_found_with_bad_cwdcCs,|tjttj|tjttjdSr)r4rr2bytestypes GenericAliasCompletedProcessrjrrrrtest_class_getitemssz#ProcessTestCase.test_class_getitemsN)zr$r%r&r:r=rHrOrRrWr_rarerprsrwrzr|rrrrrrrrrrrrrrskipIfrrrrrrrrrrrrrrC base_prefixprefixr sysconfigZis_python_buildrrrrrrrrrrrrrrrrrrplatformZget_config_varrrrrrrrr r#r(r)r/r0r6r7r;r<r=r@rIr]rbrfrhrlrmrnrqrtrwrxr}rrrrrrr skipUnlesshasattrrr rrisdirrrrrrrrrrr-gs                                 ' '  )4          r-c@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zeed%d&d'Zd(S))RunFuncTestCasecKstjd|g}tj|fi|S)Nr)rCrDrr)rrr+argvrrr run_pythons zRunFuncTestCase.run_pythoncCsP|d}||jd|tj|Wdn1sB0YdSr)rrErrMrrScheck_returncodercprrrtest_returncodes zRunFuncTestCase.test_returncodecCsN|tj}|jdddWdn1s00Y||jjddS)Nr?Tcheckr@)rMrrSrrErTrrUrrr test_checks,zRunFuncTestCase.test_checkcCs tjtdd}||jddS)NTrr)rrrrErrrrrtest_check_zeroszRunFuncTestCase.test_check_zerocCs>|tj|jdddWdn1s00YdS)NrIrirK)rMrrNrrrrr test_timeoutszRunFuncTestCase.test_timeoutcCs"|jdtjd}|d|jdS)NrXr~rYrrr3r\r0rrrrtest_capture_stdoutsz#RunFuncTestCase.test_capture_stdoutcCs"|jdtjd}|d|jdS)NrbrcrY)rrr3r\r1rrrrtest_capture_stderrsz#RunFuncTestCase.test_capture_stderrcCsLt}||j|d|d|jd|tjd}| d|j dS)Nrfrrgrri) rjrkrlr7rmrnrrr3r\r0)rrorrrrrps   z+RunFuncTestCase.test_check_output_stdin_argcCs$|jddtjd}|d|jdS)Nrgrf)rrr0rirrrrrrss z+RunFuncTestCase.test_check_output_input_argcCst}||j|d|d|jtdd }|jd|dd}Wdn1s\0Y| d|j j d| d |j j ddS) Nrfrrrr}rrr/rr) rjrkrlr7rmrnrMrrr\rTr*rrrrrs   $z6RunFuncTestCase.test_check_output_stdin_with_input_argcCsb|tj"}|jddtjd}Wdn1s40Y||jjd||jjddS)Nrr)rLr0rY) rMrrNrr3rErTr^r0)rrVrrrrrs$z)RunFuncTestCase.test_check_output_timeoutcCs2tj}d|d<|jd|d}||jddS)NrrzCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31)r!)r rrrrEr)rrrrrrtest_run_kwargs s  zRunFuncTestCase.test_run_kwargscCstrdnd}t|}|dur.||dt|}tj|tjd}||j d| t "tj|tjddWdn1s0YdS)Nztree.comrz required for this testr~rT)r0r) rr r rTrrrrrErrMr)rprogrresrrrtest_run_with_pathlike_paths   z+RunFuncTestCase.test_run_with_pathlike_pathcCs2ttj}|ddg}t|}||jddS)Nrsimport sys; sys.exit(57)9)r rrCrDrrrErrrr*rrrr&test_run_with_bytes_path_and_arguments"s   z6RunFuncTestCase.test_run_with_bytes_path_and_argumentscCs0ttj}|ddg}t|}||jddS)Nrzimport sys; sys.exit(57)r)rrCrDrrrErrrrr)test_run_with_pathlike_path_and_arguments)s   z9RunFuncTestCase.test_run_with_pathlike_path_and_argumentscCs.|jddd}|d|j|d|jdS)Nz>import sys;sys.stdout.write('BDFL'); sys.stderr.write('FLUFL')T)capture_outputrYsFLUFL)rr\r0r1rrrrtest_capture_output0s z#RunFuncTestCase.test_capture_outputcCs~t}||j|jtdd }|jdd|d}Wdn1sH0Y|d|jj d|d|jj ddS) NzAExpected ValueError when stdout and capture_output args supplied.rr}T)rr0r0rr rjrkrlr7rMrrr\rTr*rrrr#test_stdout_with_capture_output_arg8s $z3RunFuncTestCase.test_stdout_with_capture_output_argcCs~t}||j|jtdd }|jdd|d}Wdn1sH0Y|d|jj d|d|jj ddS) NzAExpected ValueError when stderr and capture_output args supplied.rr}T)rr1r1rrrrrrr#test_stderr_with_capture_output_argDs $z3RunFuncTestCase.test_stderr_with_capture_output_argz)requires posix like 'sleep' shell commandc Cst}ztjdddddWn6tjyT}zt}t}WYd}~nd}~00|d|j||dd|dd dS) Nzsleep 3TrJ)rrLrzTimeoutExpired not raised.g?z/TimeoutExpired was delayed! Bad traceback: ``` z```r) r monotonicrrrN traceback format_excrZ assertLess)rZ before_secsrZ after_secsZstacksrrr.test_run_with_shell_timeout_and_capture_outputTs    z>RunFuncTestCase.test_run_with_shell_timeout_and_capture_outputN)r$r%r&rrrrrrrrprsrrrrrrrrrrrrrrrrrrs(    rc CsJdD]6}trzt|Wnty0YqYn0|SqtddS)N)ZstaffZnogroupgrpnobodyZ nfsnobodyz?No identified group name to use for this test on this platform.)rgetgrnamKeyErrorrSkipTest) name_grouprrr_get_test_grp_namees   rzPOSIX specific testscseZdZfddZddZddZddZd d ZGd d d ej Z e d ddZ e d ddZeejd dddZddZeeeddddZeeeddddZeeedd d!d"Zeeedd#d$d%Zeeed&d'd(d)Zeeed&d*d+d,Zeep@eed- d.d/d0Zd1d2Z d3d4Z!d5d6Z"d7d8Z#d9d:Z$d;d<Z%Gd=d>d>ej Z&eejd? d@dAdBZ'dCdDZ(ee)j*dEkdFdGdHZ+dIdJZ,dKdLZ-dMdNZ.dOdPZ/dQdRZ0dSdTZ1dUdVZ2ee)j*3dWdXdYdZZ4d[d\Z5d]d^Z6d_d`Z7dadbZ8dcddZ9dedfZ:dgdhZ;didjZdodpZ?dqdrZ@dsdtZAdudvZBdwdxZCdydzZDd{d|ZEd}d~ZFddZGddZHddZIddZJddZKddZLddZMddZNddZOddZPee)j*3do,eQdjReQdjRkdddZSeTUddddZVddZWddZXddZYddZZddZ[ddZ\ddZ]ddZ^ddZ_ddZ`eTjaddZbeTjaddZcddZdddZeddZfddZgeehduoeehddddZiddÄZjddńZkddDŽZlZmS)POSIXProcessTestCasecstd|_dS)Nz/_this/pa.th/does/not/exist)superr_nonexistent_dirrrrrrts zPOSIXProcessTestCase.setUpc CsNzt|jWn(ty8}z|}WYd}~nd}~00|d|j|S)Nz,chdir to nonexistent directory %s succeeded.)r chdirrrRr)rrZdesired_exceptionrrr_get_chdir_exceptionxsz)POSIXProcessTestCase._get_chdir_exceptionc Cs|}ztjtjddg|jd}WnTtyx}z<||j|j||j |j ||j |j WYd}~nd}~00| d|dS)NrrrExpected OSError: %s rrr2rCrDrrRrErSstrerrorrrrrr9rZrrrtest_exception_cwds &z'POSIXProcessTestCase.test_exception_cwdc Cs|}ztjtjddg|jd}WnTtyx}z<||j|j||j |j ||j |j WYd}~nd}~00| d|dS)Nrrrrrrrrrtest_exception_bad_executables &z2POSIXProcessTestCase.test_exception_bad_executablec Cs|}zt|jddg}WnTtyr}z<||j|j||j|j||j|jWYd}~nd}~00| d|dS)Nrrr) rrr2rrRrErSrrrrrrrtest_exception_bad_args_0s&z.POSIXProcessTestCase.test_exception_bad_args_0c@seZdZddZdS)z&POSIXProcessTestCase.PopenNoDestructorcCsdSrrrrrr__del__sz.POSIXProcessTestCase.PopenNoDestructor.__del__N)r$r%r&r rrrrPopenNoDestructorsr z%subprocess._posixsubprocess.fork_execc Csvdd}||_tjdtdF|t|dgWdn1sJ0YWdn1sh0YdS)NcWs0|d}dtj}t|d|ddS)N z{:x}sOSError::r)rGrSZEISDIRrr rm)r* errpipe_writeZerr_coderrr proper_errorszHPOSIXProcessTestCase.test_exception_errpipe_normal..proper_errorsubprocess.os.waitpid side_effectnon_existent_command)rrrChildProcessErrorrMIsADirectoryErrorr )r fork_execrrrrtest_exception_errpipe_normals z2POSIXProcessTestCase.test_exception_errpipe_normalc sdfdd}||_tjdtdH|tj}|dgWdn1sT0YWdn1sr0Y|t t |j dS)Nsޭcs|d}t|dS)Nrr)r rm)r*rZ error_datarr bad_errors zGPOSIXProcessTestCase.test_exception_errpipe_bad_data..bad_errorrrr) rrrrrMrSubprocessErrorr r\rrjrT)rrrrZrrrtest_exception_errpipe_bad_datas Hz4POSIXProcessTestCase.test_exception_errpipe_bad_data/proc/self/statuszneed /proc/self/statuscCstjddgdd}|D]}|dr|}qrrrrtest_group_errorns z%POSIXProcessTestCase.test_group_error setgroupszno setgroups() on platformc Cst}|dkrdndg}t}d}tdur6||ztjtjddg|d}Wn6t y}z|j t j krnd}WYd}~nfd}~00t }t |}tdurdd |D} n|} |r|t|t|n|t| t||t tjtd gdWdn1s0Y|t(tjttjtjd gd Wdn1sZ0Ytdur|t tjt|gdWdn1s0YdS) Nr*r+Frz;import os, sys, json; json.dump(os.getgroups(), sys.stdout) extra_groupsTcSs&g|]}t|trt|jn|qSr)r8rjrrrD)r grrrrsz:POSIXProcessTestCase.test_extra_groups..r0r2)rrrK)r rCrrrNrr[rCrDrRrSr% getgroupsjsonloadsrEsetrMrrQrrr) rrErFrZ perm_errorr^exZ parent_groupsZ child_groupsZ desired_gidsrrrtest_extra_groupsssN     0 &  z&POSIXProcessTestCase.test_extra_groupsz!setgroups() available on platformcCs<|ttjtgdWdn1s.0YdS)NrJr>rrrrtest_extra_groups_errors z,POSIXProcessTestCase.test_extra_groups_errorumaskzPOSIX umask() is not available.c Csd}zt}tj|d}tjtjdd|dgddt |j d@}d}|j ||t |d t |d W|durt |n|durt |0dS) NZbeansrzopen(z, 'w').close()+)rTiiz != r)rjrLr rrrrQrCrDstatst_moderEoctr rV)rrXnamerWZ expected_moderrr test_umasks" zPOSIXProcessTestCase.test_umaskcCsXt*ttjddg}|Wdn1s80Y||j t j dS)Nrzimport os; os.abort()) rrorr2rCrDrrErrSIGABRTr8rrrtest_run_aborts   &z#POSIXProcessTestCase.test_run_abortcCsNtttj d}t|}|d||d||ttj|dS)Nfake cmdrZSIG)rrSr'rr[rjr\lowerrrZ error_stringrrr"test_CalledProcessError_str_signals  z7POSIXProcessTestCase.test_CalledProcessError_str_signalcCs$tdd}t|}|d|dS)NiKir]zunknown signal 9876543.rrSrjr\r_rrr*test_CalledProcessError_str_unknown_signals z?POSIXProcessTestCase.test_CalledProcessError_str_unknown_signalcCs$tdd}t|}|d|dS)Nr]znon-zero exit status 2.rar_rrr$test_CalledProcessError_str_non_zeros z9POSIXProcessTestCase.test_CalledProcessError_str_non_zerocCsXtjtjddgtjddd}|"||jdWdn1sJ0YdS)NrrcSs tddS)Nrapple)r putenvrrrrrz3POSIXProcessTestCase.test_preexec..)r0 preexec_fnapplerr8rrr test_preexecs z!POSIXProcessTestCase.test_preexecc Csdd}ztjtjddg|d}WnhtjyV}z|tjdWYd}~nHd}~0ty}z|d|j dWYd}~nd}~00| d dS) NcSs tddS)Nz'What if two swallows carried a coconut?rrrrrraise_itsz=POSIXProcessTestCase.test_preexec_exception..raise_itrrrhz)Expected a ValueError from the preexec_fnZcoconutrzEException raised by preexec_fn did not make it to the parent process.) rr2rCrDrr%_posixsubprocessrr\r*r)rrlr9rZrrrtest_preexec_exceptions (z+POSIXProcessTestCase.test_preexec_exceptionc@seZdZddZddZdS)z+POSIXProcessTestCase._TestExecuteChildPopencOs$||_tjj|g|Ri|dSr) _testcaserr2r)rZtestcaser*r+rrrrsz4POSIXProcessTestCase._TestExecuteChildPopen.__init__cOsztjj|g|Ri|WddtdD}zL|D].}|jj||j|j|j fddq6W|D]}t |qln|D]}t |q0nxddtdD}zL|D].}|jj||j|j|j fddqW|D]}t |qn|D]}t |q00dS)NcSsg|]}tdtjqS) /dev/zero)r rOO_RDONLYr r"rrrrszNPOSIXProcessTestCase._TestExecuteChildPopen._execute_child..z!At least one fd was closed early.r) rr2r,rMrprvr/rr0r1r r7)rr*r+Z devzero_fdsrrrrr,s@  z:POSIXProcessTestCase._TestExecuteChildPopen._execute_childN)r$r%r&rr,rrrr_TestExecuteChildPopensrurqz/dev/zero required.c CsTdd}|tj,|j|ttjtjtj|dWdn1sF0YdS)NcSstddS)Nz-force the _execute_child() errpipe_data path.)rrrrrrrlszWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes..raise_it)r/r0r1rh)rMrrrurr3)rrlrrr0test_preexec_errpipe_does_not_double_close_pipesszEPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipescCs&dd}t}tj}tj}zt|ttjtjddgddd|tdt| ttjtjddgd dd| td |t_|j t tj tjddgd ddt`|j t tj tjddgd ddW|t_|t_|s"tn|t_|t_|s t0dS) NcSs tddS)Nzthis shouldn't escape) RuntimeErrorrrrrraise_runtime_error!szPPOSIXProcessTestCase.test_preexec_gc_module_failure..raise_runtime_errorrrcSsdSrrrrrrrg*rzEPOSIXProcessTestCase.test_preexec_gc_module_failure..rmz#Popen enabled gc when it shouldn't.cSsdSrrrrrrrg1rzPopen left gc disabled.cSsdSrrrrrrrg7rcSsdSrrrrrrrg<r)gc isenableddisabler rrBrCrDenabler%rMrwr2rz)rrxZenabledZorig_gc_disableZorig_gc_isenabledrrrtest_preexec_gc_module_failuresJ      z3POSIXProcessTestCase.test_preexec_gc_module_failurer,z!setrlimit() seems to fail on OS Xc Cszddlm}m}m}Wn.tyF}z||WYd}~n d}~00||}|\}}||d|f||||ztjt j ddgdddWnt yYn 0|ddS) Nr) getrlimit setrlimit RLIMIT_NPROCrrcSsdSrrrrrrrgRrz@POSIXProcessTestCase.test_preexec_fork_failure..rmz.RLIMIT_NPROC had no effect; probably superuser) resourcer~rrr{rTrlrrBrCrDBlockingIOError)rr~rrrZlimitsr"Zhardrrrtest_preexec_fork_failureCs   z.POSIXProcessTestCase.test_preexec_fork_failurecCst\}}t|ddd0}|dtj|dtjWdn1sP0Yt |dt |}| t |||jddSNwrC)rFz#!%s z(exec '%s' -c 'import sys; sys.exit(47)' ir@)rjrrOrmr unix_shellrCrDr chmodrr2rrrEr)rrfnamefobjr9rrrtest_args_stringYs $   z%POSIXProcessTestCase.test_args_stringcCs<|jttjtjddgdd|jttjtjddgdddS)Nrr?r@ startupinfo creationflagsrMrrrBrCrDrrrrrgs  z&POSIXProcessTestCase.test_invalid_argscCshtj}d|d<tjdgdtj|d}|(||j ddWdn1sZ0YdSNrerz echo $FRUITrrr0rs ri r rrrr2r3rEr0rrrrr9rrrtest_shell_sequencers  z(POSIXProcessTestCase.test_shell_sequencecCsftj}d|d<tjddtj|d}|(||j ddWdn1sX0YdSrrrrrrtest_shell_string|s z&POSIXProcessTestCase.test_shell_stringcCst\}}t|ddd0}|dtj|dtjWdn1sP0Yt |dt |}t || |ddSr)rjrrOrmrrrCrDr rrrBrrE)rrrrrGrrrtest_call_strings $   z%POSIXProcessTestCase.test_call_stringc Csg}dD]2}dD](}tj||}tj|r||qq|sJ|dd}tj|rptj|sp|||D]X}tjd|dtj d}|,| |j t|dWdqt1s0YqtdS) N)z/binz /usr/bin/z/usr/local/bin)ZbashZkshz"bash or ksh required for this testz/bin/shzecho $0T)rDrr0r)r rrisfilerNrTislinkrr2r3rEr0rrr)rZshellsrrYshr9rrrtest_specific_shells"    z(POSIXProcessTestCase.test_specific_shellc Gstttjtj}z4tjtjddgdtjtjtjd}Wttj|nttj|0|j dt ||||S)Nrzif 1: import sys, time sys.stdout.write('x\n') sys.stdout.flush() time.sleep(30) Tr/r/r0r1r) rSIGINTdefault_int_handlerrr2rCrDr3r0rgetattr)rmethodr*rr9rrr _kill_processs  z"POSIXProcessTestCase._kill_process)ZnetbsdZopenbsdz"Due to known OS bug (issue #16762)cGsRtjtjddgdtjtjtjd}|jdtdt |||| dS)Nrzif 1: import sys, time sys.stdout.write('x\n') sys.stdout.flush() Trr) rr2rCrDr3r0rrrrr)rrr*r9rrr_kill_dead_processs  z'POSIXProcessTestCase._kill_dead_processcCs:|dtj}|\}}|d|||ddS)N send_signalsKeyboardInterruptr)rrrrr\r"rrr9r"r1rrrtest_send_signals  z%POSIXProcessTestCase.test_send_signalcCs:|d}|\}}||d||tj dS)Nrr)rrrErrSIGKILLrrrr test_kills   zPOSIXProcessTestCase.test_killcCs:|d}|\}}||d||tj dS)N terminater)rrrErrSIGTERMrrrrtest_terminates   z#POSIXProcessTestCase.test_terminatecCs|dtjdSNr)rrrrrrrtest_send_signal_deadsz*POSIXProcessTestCase.test_send_signal_deadcCs|ddSNrrrrrrtest_kill_deadsz#POSIXProcessTestCase.test_kill_deadcCs|ddSNrrrrrrtest_terminate_deadsz(POSIXProcessTestCase.test_terminate_deadcCs6g}|D](}t|}t|}||||fq|Sr)r get_inheritableduprN)rZsave_fdsrr inheritablesavedrrr _save_fdss   zPOSIXProcessTestCase._save_fdscCs.|D]$\}}}tj|||dt|qdS)N)r)r dup2r7)rrrrrrrr _restore_fdssz!POSIXProcessTestCase._restore_fdsc Csd}||}|D]\}}}|dkr|}q.qz`|D]}t|q4tjtjddg|tjtjd\}}| |d| |dW| |n | |0dS)Nrrrr.rir) rr r7rr2rCrDr3rrEr) rrr/ saved_fdsrrrrrrrrcheck_close_std_fds s&    z(POSIXProcessTestCase.check_close_std_fdscCs|dgdSrPrrrrrtest_close_fd_0 sz$POSIXProcessTestCase.test_close_fd_0cCs|dgdSNrrrrrrtest_close_fd_1 sz$POSIXProcessTestCase.test_close_fd_1cCs|dgdS)Nrcrrrrrtest_close_fd_2! sz$POSIXProcessTestCase.test_close_fd_2cCs|ddgdS)Nrrrrrrrtest_close_fds_0_1$ sz'POSIXProcessTestCase.test_close_fds_0_1cCs|ddgdS)Nrrcrrrrrtest_close_fds_0_2' sz'POSIXProcessTestCase.test_close_fds_0_2cCs|ddgdS)Nrrcrrrrrtest_close_fds_1_2* sz'POSIXProcessTestCase.test_close_fds_1_2cCs|gddS)N)rrrcrrrrrtest_close_fds_0_1_2- sz)POSIXProcessTestCase.test_close_fds_0_1_2c Cstd}td}zZtdtdttjddgWt|dt|dt|t|n.t|dt|dt|t|0dS)Nrrrz*print('AssertionError:0:CLOEXEC failure.')) r rr7rr2rCrDrr)rZ new_stdinZ new_stdoutrrrtest_small_errpipe_write_fd2 s"           z0POSIXProcessTestCase.test_small_errpipe_write_fdc Cs^ddtdD}z,dd|D}|D]\}}t|q(t|ddt|ddd|td}zZt|D]\}}t||qvtj t j dd g|d|d |dd }| W| |n | |0|D]}t|ddqt|d d }t|dd } ||d || dW|D]}t|q.n|D]}t|qF0dS)NcSsg|] }tqSrrjrr rYrrrrI rz?POSIXProcessTestCase.test_remapping_std_fds..rcSsg|] \}}|qSrrr rrrrrrK rrSTDINrrZimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err")rcr.r got STDINerr)rMr unlinkrmrr enumeraterrr2rCrDrrrrrEr7) rtempstemp_fdsrrrtemp_fdr9rrrrrtest_remapping_std_fdsG s<     z+POSIXProcessTestCase.test_remapping_std_fdsc CsBddtdD}dd|D}z|D]\}}t|q(|td}zt|D]\}} t| |qTt|dt|ddtj t j ddg|||d } | |D]}t|ddqt |d } t |d } W||n ||0|| d || d W|D]}t|qn|D]}t|q*0dS) NcSsg|] }tqSrrrrrrrv rz7POSIXProcessTestCase.check_swap_fds..rcSsg|] \}}|qSrrrrrrrw rrrrrr.rrr)rMr rrrrrmrrr2rCrDrrrrrEr7) rZstdin_noZ stdout_noZ stderr_norrrrrrr9rrrrrcheck_swap_fdst s<      z#POSIXProcessTestCase.check_swap_fdscCsX|ddd|ddd|ddd|ddd|ddd|ddddS)Nrrrc)rrrrr test_swap_fds s z"POSIXProcessTestCase.test_swap_fdscCs|td}zj|D]<}t }t||Wdq1sH0Yqttdt|}t |gd}i}t ||D]\}} |||| <qt d} ttdt|} t jtjd| t| gfi|} || dt ||D]r\}} t|dtjt|d} ttt| d}t d|d |d |d |d | d }|| g||qW||n ||0dS)Nrr.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')) rrrrz" When testing z to z4 redirection, parent descriptor z5 got redirected to descriptor(s) z instead of descriptor z. )rrMrjrkr rrrPrUr7zipr9r:rrBrCrDrjrErSEEK_SETrrmapr'rr)rfrom_fdsto_fdsrZfrom_fdfZ fd_to_close arg_namesr+Zto_fdrZ skipped_fdrG read_bytesZread_fdsrrrr#_check_swap_std_fds_with_one_closed sD 0     z8POSIXProcessTestCase._check_swap_std_fds_with_one_closedcCs<ttddD]&}ttddD]}|||q$qdS)Nrrc) itertools combinationsrM permutationsr)rrrrrr!test_swap_std_fds_with_one_closed sz6POSIXProcessTestCase.test_swap_std_fds_with_one_closedc Csdd}ztjt|dWntyZ}z(|tj|t|dWYd}~nTd}~0tjy}z(| tj|t|dWYd}~nd}~00| ddS)NcSs tddS)N surrogate:rkrrrrprepare szCPOSIXProcessTestCase.test_surrogates_error_message..preparermrz!Exception occurred in preexec_fn.z1Expected ValueError or subprocess.SubprocessError) rrBrrrdrnrErjrassertIsNotNoner)rrrrrrtest_surrogates_error_message s  $ &z2POSIXProcessTestCase.test_surrogates_error_messagecCsdD]\}}|dd}dt|}tj}|||<d|d<|}tjtjd|g|d}| d }| | dt ||dd}d t|}tj}|||<tjtjd|g|d}| d }| | dt |qdS) N))testuabc)utestZ42rrCz&import os; print(ascii(os.getenv(%s)))CLC_ALLrrs z'import os; print(ascii(os.getenvb(%s)))) rrr rrrr[rCrDrrErr)rkeyvalueZ encoded_valuescriptrZ decoded_valuer0rrrtest_undecodable_env s.           z)POSIXProcessTestCase.test_undecodable_envc Csttd}ttdd}tjtd\}}t|}t|g|}||dd|d | df}tj|dd}||dtj }||d<tj|g||d }||dtj }t||d <tj|g||d }||ddS) Nrrs'%s' %s rETrPATHrsPATH)r rrrrrrrBrErrrrenvironb) rZ abs_programr*rZprogramexitcoderrZenvbrrrtest_bytes_program s"      z'POSIXProcessTestCase.test_bytes_programc Cstjddd}tjddd}tjtj|gtjtjtjdd}||jdtjtj|gtjdd}|\}}t t t | d }t |j |j|jg}|||@d |||@fdS) Nzinput_reader.pysubprocessdataZsubdir fd_status.pyF)r/r0r1r/rr0r/,z5Expected no fds from %r to be open in child, found %r)rfindfilerr2rCrDr3rlrrPrr'rr/rr0r1r ) rZsleeper fd_statusp1p2r^errorZ result_fdsZ unwanted_fdsrrrtest_pipe_cloexec( s(     z&POSIXProcessTestCase.test_pipe_cloexecc stjddd}tjddd}d}|dd}tjtj|gtjtjdd tjtj||gjtjdd |j |j fd d }fd d }||||j |j t jgggd\}}} ||d|j|j j dS)Nzqcat.pyrrzqgrep.pyszxcvbn F)r/r0r/cs$z WntyYn0dSrrProcessLookupErrorr)rrrkill_p1P s  zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools..kill_p1cs$z WntyYn0dSrrr)rrrkill_p2U s  zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools..kill_p2rJzThe child hung)rrrr2rCrDr3r0rlrr/rmr7selectr%rEr) rZqcatZqgrepZsubdatar[rrZ readfilesZignored1Zignored2r)rrrtest_pipe_cloexec_real_tools? s2            z1POSIXProcessTestCase.test_pipe_cloexec_real_toolsc stjddd}t}|tj|d|tj|dt|tdD],}ttj tj }|tj| |qJD]}t |dq|t jtj|gt jdd }|\}}ttt|d }||@d t jtj|gt jdd }|\}}ttt|d }||@d |d|d tfddtdD} t jtj|gt jd| d}|\}}ttt|d }||| @d|d|d dS)Nrrrrr TFrrzSome fds were closedzSome fds were left openzSubprocess failedc3s|]}VqdSr)rUrsrrr rz6POSIXProcessTestCase.test_close_fds..rtr0r/pass_fdsz'Some fds not in pass_fds were left open)rrr r+rlr7rPrMrOdevnullrraddset_inheritablerr2rCrDr3rrr'rrEr r\) rrrr"rr9r^ignored remaining_fds fds_to_keeprrrtest_close_fdsh sN          z#POSIXProcessTestCase.test_close_fdsZfreebsdz/devz/dev/fdz/Requires fdescfs mounted on /dev/fd on FreeBSD.cCstjddd}tjtjdtd|gtjd}| \}}| }|j t |dd|d t tt|d d }t tt|d d }|j||@d d dS)NrrrraK 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)) r~rcz(expected exactly two lines of output: %rrrrrzSome fds were left open.)rrrr2rCrDr9r:r3rr!rEr!rPrr'rrr )rrr9r^Z unused_stderrZ output_linesZ opened_fdsr rrr%test_close_fds_when_max_fd_is_lowered s$ /02   z:POSIXProcessTestCase.test_close_fds_when_max_fd_is_loweredrJr`c Cs@tjddd}t}tdD]Z}t}|tj|d|tj|dt|ddt|dd| |q|D]}t j t j |gt jd|fd}|\}}ttt|d } ||h} ||| d || | @d |t(} |t jtd |fd Wdn1s0Y|dt| jq|dS)Nrrrr`rrTrrzfd to be passed not passedzfd to be closed passedF)r/rzoverriding close_fds)rrrPrMr r+rlr7r updaterr2rCrDr3rrr'rr\r Z assertWarnsrvrBrrjwarning) rrrr-rrr9r^r r Z to_be_closedcontextrrr test_pass_fds s6       (z"POSIXProcessTestCase.test_pass_fdsc Cstjddd}t\}}|tj||tj|t|dt|d||f}tj|g}|t t t |7}t j |t jd|d}|\}}tt t|d} || t|d||t|d|t|ddS) NrrrTFrrz output=%a)rrr r+rlr7r rCrDrrrjrr2r3rrPr'rrEr) rrrZnon_inheritablerr*r9r^r rrrrtest_pass_fds_inheritable s$     z.POSIXProcessTestCase.test_pass_fds_inheritablec Cstjddd}g}tdD],}ttjtj}|tj|| |qt \}}|tj||tj|| d|t j tj|g|d|d|dd|dt|d }Wdn1s0Yd d |d D}||hd t|Bd|dS)NrrrrcrrT)r/r0r1r/rrcSsh|] }t|qSr)r')r numrrr @ rz@POSIXProcessTestCase.test_pass_fds_redirected..r>rrrczoutput=)rrrMr rOrO_RDWRrlr7rNr+insertrr2rCrDrrrE frozenset) rrrr"rZstdout_rZstdout_wr^rrrrtest_pass_fds_redirected+ s(     *z-POSIXProcessTestCase.test_pass_fds_redirectedcCsJttjd(}tjt||d}|Wdn1s<0YdS)Nr+)r0r/r5rOr rrr2rrrZinoutr9rrr%test_stdout_stdin_are_single_inout_fdE s z:POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fdcCsJttjd(}tjt||d}|Wdn1s<0YdS)Nrrrrrrr&test_stdout_stderr_are_single_inout_fdK s z;POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fdcCsJttjd(}tjt||d}|Wdn1s<0YdS)Nr)r1r/rrrrr%test_stderr_stdin_are_single_inout_fdQ s z:POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fdcCsRtjddd}tjtj|gtjtjd}|\}}|d|j d| ddS)Nzsigchild_ignore.pyrrrrz6sigchild_ignore.py exited non-zero with this error: %srE) rrrr2rCrDr3rrErr)rZsigchild_ignorer9r0r1rrrtest_wait_when_sigchild_ignoredW s   z4POSIXProcessTestCase.test_wait_when_sigchild_ignoredc Cstd}tjtjddgtjdd}|j}||j z<| | dd| || |gggddW|n |0dS) Nrrz$import sys;sys.stdout.write("apple")r)r0r;rsapplg)r import_modulerr2rCrDr3r0rlr7rErr\rr)rrr9rrrrtest_select_unbufferedb s    z+POSIXProcessTestCase.test_select_unbufferedcCstjtjddgtjtjd}||jj||jjt |}|j }t dt fd}Wdn1sn0Ytr|tjn||ddtjDdS)Nrz import sys, time;time.sleep(0.2)rrcSsg|] }t|qSridr orrrr rzEPOSIXProcessTestCase.test_zombie_fast_process_del..)rr2rCrDr3rlr0r7r1r%pidrcheck_warningsResourceWarningrrdrr\)rr9identr(rrrtest_zombie_fast_process_dels s "z1POSIXProcessTestCase.test_zombie_fast_process_delc Csdtjtjddgtjtjd}||jj||jjt |}|j }t dt fd}t Wdn1sv0Yt|tjtr|tjn||ddtjDtd|tDtjttjtjd}Wdn1s0YWdn1s0Y|ttj|dtrH|tjn||d dtjDdS) Nrzimport time;time.sleep(3)rrcSsg|] }t|qSrr$r&rrrr rzJPOSIXProcessTestCase.test_leak_fast_process_del_killed..rrcSsg|] }t|qSrr$r&rrrr r)rr2rCrDr3rlr0r7r1r%r(rr)r* gc_collectr rrrrrdrr\rrrMrRrwaitpidrv)rr9r+r(r|rrr!test_leak_fast_process_del_killed s: &  >z6POSIXProcessTestCase.test_leak_fast_process_del_killedcsxtjddd}td|tjtjtj |gtj dfddd}| \}}t t t|d }||dS) NrrrrTcs tdSr)r rrrrrrg rzCPOSIXProcessTestCase.test_close_fds_after_preexec..)r0r/rhr)rrr rrlr7rr2rCrDr3rrPrr'rrv)rrr9r^r r rr0rtest_close_fds_after_preexec s    z1POSIXProcessTestCase.test_close_fds_after_preexecc Csddl}t}zdd}tddgddgfdgdddgfdgdgddgfdgdgddffD]z\}}}}|tB}|||dd ||d d d d d d d ddddgdd |Wdn1s0Y|dt|j q`W|st n|st 0dS)NrcSsdSrrrrrrrg rz5POSIXProcessTestCase.test_fork_exec..rsexeenvsargTrr0rrcrrFz takes exactly) rnryrzr|rMrrrvrjrTr{) rrn gc_enabledfuncr*Zexe_listrenv_listrrrrtest_fork_exec s2 " z#POSIXProcessTestCase.test_fork_execcCsddl}Gddd}t}ztddddd|d |d ffD]}|jtd |d H}|d gd gd|ddgddddd d dddddddddWdn1s0Y|dt |j qDW|st n|st 0dS)Nrc@s eZdZdZddZddZdS)zJPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check..BadIntTcSs ||_dSr)r)rrrrrr szSPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check..BadInt.__init__cSs|jrd|_|jStdS)NF)firstrrrrrr__int__ szRPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check..BadInt.__int__N)r$r%r&r7rr8rrrrBadInt sr9)r0rcrrr`)rjr)*l)r`r)r2rrrtrrczfds_to_keep={}rsfalseTr2r0rrr ) rnryrzr|rMrrGrr\rjrTr{)rrnr9r3r rVrrr%test_fork_exec_sorted_fd_sanity_check s>  " z:POSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_checkc Csztt}|Xtj|d*}t|j_| |j Wdn1sN0YWdn1sl0YdS)Nr/) rr2rrrrBrokenPipeErrorr7rrZassert_called_withrr|mock_proc_stdinrrr,test_communicate_BrokenPipeError_stdin_close s  zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_closec Cstt}|ftj|d8}t|j_| d|j d|j Wdn1s\0YWdn1sz0YdS)Nr/stuff) rr2rrrrr>rmrrassert_called_once_withr7r?rrr,test_communicate_BrokenPipeError_stdin_write" s    zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_writec Cstjtjdgtjtjd}|tj|dd}tt j d8}t |j _ ||j_|d|j Wdn1sz0YWdn1s0YWdn1s0YdS)N-hrr/wbrB)rr2rCrDr3rrrrOr rr>r4rr return_valuerrC)rr|r@Zdev_nullrrr,test_communicate_BrokenPipeError_stdin_flush, s    zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flushc Cstjtjdgtjtjd}|\tj|d.}t|j _ |j dd|j Wdn1sb0YWdn1s0YdS)NrErr/irK) rr2rCrDr3rrrr>r7rrrCr?rrr9test_communicate_BrokenPipeError_stdin_close_with_timeout; s  zNPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeoutN W_STOPCODEzneed _testcapi.W_STOPCODEcCstt}t|}tj|jddtd}tj d|j|fd| }Wdn1sZ0Y| |ddS)Nrrrr)rG) rrr2r wait_processr( _testcapirJrrrrE)rr*r|statusrrrr test_stoppedG s  &z!POSIXProcessTestCase.test_stoppedcCsttt}tj|jdd||jt d}| t j Wdn1sR0Y| ||jdS)NrrKzos.kill)rr2rrrMr(rdrrrrrrZassert_not_calledr)rr|Z mock_killrrrtest_send_signal_raceX s   *z*POSIXProcessTestCase.test_send_signal_racecCsnttjddg}|js"|qtjj|dddd"d|_| t j Wdn1s`0YdS)Nrzexit(1)recSsdSrrrrrrrgw rz=POSIXProcessTestCase.test_send_signal_race2..)new) rr2rCrDrrerrrrrrr8rrrtest_send_signal_race2n s  z+POSIXProcessTestCase.test_send_signal_race2cCsFtjtjddgtjd}z|jddWdStjy>Yq0qdS)Nrz+import os, time; os.close(1), time.sleep(2)r~rJrK)rr2rCrDr3rrNrr|rrr1test_communicate_repeated_call_after_stdout_close{ s  zFPOSIXProcessTestCase.test_communicate_repeated_call_after_stdout_close)nr$r%r&rrr r r rr2r rrrrrrr rrr#r(rrr<r?rGrHrRrSrrZr\r`rbrdrjrorurvr}rCrrrrrrrrrr rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrVst_devrrZrequires_mac_verrrrrrr r!r#r,r/r1 cpython_onlyr6r=rArDrHrIrNrPrQrSrU __classcell__rrrrrqs      3  )  0     %       -0,)0 P  ! + ' )     rzWindows specific testsc@seZdZddZddZddZddZd d Zej d d Z d dZ ddZ ddZ ddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-S).Win32ProcessTestCasecCs.d}d}t}||_||_tjt|ddS)Nrrr)r STARTUPINFOdwFlags wShowWindowrBr)rSTARTF_USESHOWWINDOW SW_MAXIMIZErrrrtest_startupinfo sz%Win32ProcessTestCase.test_startupinfocCs(d}d}tj||d}tjt|ddS)Nrr)r[r\r)rrZrBr)rZSTARTF_USERSHOWWINDOWr^rrrrtest_startupinfo_keywords sz.Win32ProcessTestCase.test_startupinfo_keywordsc Cst}tj|_tj|_tdD]}t}tt j d^}tj ||tj |d}|| Wdn1sl0Y||jdWdn1s0Y||jtj||j||j||j||jtj||jdgiq dS)Nrcr)r0r1rr handle_list)rrZr]r[ZSW_HIDEr\rMrrOr rr2rdrrErrdZ hStdInputZ hStdOutputZ hStdErrorlpAttributeList)rrr"rZnullr|rrrtest_startupinfo_copy s, &,   z*Win32ProcessTestCase.test_startupinfo_copycCs(d}tjdtjtjd|ddS)Nz' a DOS box should flash briefly ... z# -c "import time; time.sleep(0.25)"r)rCr1rmrrBrD)rZCREATE_NEW_CONSOLErrrtest_creationflags s z'Win32ProcessTestCase.test_creationflagscCs$|jttjtjddgddddS)Nrr?cSsdSrrrrrrrg rz8Win32ProcessTestCase.test_invalid_args..rmrrrrrr s  z&Win32ProcessTestCase.test_invalid_argscCsNGdddt}|t tjt|dWdn1s@0YdS)Nc@seZdZdZdS)z4Win32ProcessTestCase.test_issue31471..BadEnvN)r$r%r&keysrrrrBadEnv srgr)dictrMrrr2r)rrgrrrtest_issue31471 s z$Win32ProcessTestCase.test_issue31471cCs&tjtjddgdd}||ddS)Nrr?T)r/r@rArFrrrr s  z#Win32ProcessTestCase.test_close_fdsc Csddl}t}|tj|d|tj|dg}|D] }t|d|||qrq)rencrr9rrrtest_shell_encodings4 s z)Win32ProcessTestCase.test_shell_encodingscCs ttjd}||ddS)Nz -c "import sys; sys.exit(47)"r@rArFrrrr@ sz%Win32ProcessTestCase.test_call_stringcGstjtjddgtjtjtjd}|J|jdt||||\}}| |d| }Wdn1st0Y| |ddS)Nrzif 1: import sys, time sys.stdout.write('x\n') sys.stdout.flush() time.sleep(30) r.rrr) rr2rCrDr3r0rrrrErr")rrr*r9r"r1rrrrrF s    &z"Win32ProcessTestCase._kill_processcGstjtjddgtjtjtjd}|T|jdtdt |||| \}}| |d| }Wdn1s~0Y| |ddS)Nrzif 1: import sys, time sys.stdout.write('x\n') sys.stdout.flush() sys.exit(42) r.rrr<) rr2rCrDr3r0rrrrrrEr)rrr*r9r"r1rGrrrr[ s     &z'Win32ProcessTestCase._kill_dead_processcCs|dtjdSr)rrrrrrrrr sz%Win32ProcessTestCase.test_send_signalcCs|ddSrrrrrrru szWin32ProcessTestCase.test_killcCs|ddSrrurrrrrx sz#Win32ProcessTestCase.test_terminatecCs|dtjdSr)rrrrrrrr{ sz*Win32ProcessTestCase.test_send_signal_deadcCs|ddSrrrrrrr~ sz#Win32ProcessTestCase.test_kill_deadcCs|ddSrrrrrrr sz(Win32ProcessTestCase.test_terminate_deadN)r$r%r&r_r`rcrerrrWrirrjrmrnrrrtrrrrrrrrrrrrrrY s. 1   rYc@s^eZdZGdddejZejejdddZ ddZ dd Z d d Z d d Z ddZdS) MiscTestscs eZdZgZfddZZS)zMiscTests.RecordingPopencs"tj|i||j|dSr)rrinstances_createdrNr)rrrr sz!MiscTests.RecordingPopen.__init__)r$r%r&rwrrXrrrrRecordingPopen srx _communicatec Kst|_zjtjtjd}t|_tjtd|jX|t.|t j ddgfdtj i|Wdn1sv0YWdn1s0Y|j ddD]"}| |tjddd|j qg}|j D]}|tjd dkr||q|j|jd |j d |jt|d|j d Wdn1s:0YW|jj}|||g|jjn.|jj}|||g|jj0dS) N_waitr2rzLimport time time.sleep(9) import sys sys.stderr.write('\n!runaway child!\n')r0rrKz.no open-ended wait() after the first allowed: g?rcr)KeyboardInterruptrrrrrr2rxrMrCrDrZcall_args_listr"rBrNZassertLessEqualZ call_countrEr!rwrUrr)rZpopenerZmock__communicater+Z mock__waitrBZ sigint_callsrrrr_test_keyboardinterrupt_no_kill sP   B     (  z)MiscTests._test_keyboardinterrupt_no_killcCs|jtjdddSNgT㥛 @rK)r|rrBrrrr#test_call_keyboardinterrupt_no_kill sz-MiscTests.test_call_keyboardinterrupt_no_killcCs|jtjdddSr})r|rrrrrr"test_run_keyboardinterrupt_no_kill sz,MiscTests.test_run_keyboardinterrupt_no_killcCsdd}||dS)Nc_s8tj|i|}tWdn1s*0YdSr)rr2r{)r*r+Zunused_processrrrpopen_via_context_manager sz[MiscTests.test_context_manager_keyboardinterrupt_no_kill..popen_via_context_manager)r|)rrrrr.test_context_manager_keyboardinterrupt_no_kill sz8MiscTests.test_context_manager_keyboardinterrupt_no_killc Cs|tdd|tddd}zRt}tj|d}tt rLdnd|\}}| |dW|durt |n|durt |0dS)Nz echo xyzzyxyzzy)rrZfooztype zcat r) rEr getoutputgetstatusoutputrjrLr rrrr"rmdir)rdirrYrOr^rrrtest_getoutput s   zMiscTests.test_getoutputcCsnhd}ttj}t}ddl}tjD].\}}|dr>q*t||jfrNq*| |q*| |||dS)N>rHandler4rarr") rPr__all__r__dict__itemsr r8 ModuleTyper rE)rZintentionally_excludedZexportedZpossible_exportsrrYrrrr test__all__ s   zMiscTests.test__all__N)r$r%r&rr2rxrrrr|r~rrrrrrrrrv s +rv PollSelectorz!Test needs selectors.PollSelectorc@seZdZddZddZdS)ProcessTestCaseNoPollcCstj|_tjt_t|dSr)r_PopenSelector orig_selector selectorsSelectSelectorr-rrrrrr szProcessTestCaseNoPoll.setUpcCs|jt_t|dSr)rrrr-r"rrrrr" szProcessTestCaseNoPoll.tearDownNr#rrrrr srzWindows-specific testscsPeZdZfddZfddZddZddZd d Zd d Zd dZ Z S)CommandsWithSpacescs>ttdd\}}||_t|dt|dS)Nz.pyzte stsVimport sys;sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv]))) rrrjrr^rr rmr7)rrrrrrr s    zCommandsWithSpaces.setUpcst|jtdSr)r rrrr"rrrrr"s zCommandsWithSpaces.tearDowncOs`tj|d<tj|i|}|.||jdd|jWdn1sR0YdS)Nr0mbcsz2 [%r, 'ab cd'])rr3r2rEr0rrr)rr*r+r9rrr with_spacess zCommandsWithSpaces.with_spacescCs |jdtj|jdfdddS)N"%s" "%s" "%s"ab cdrrrrCrDrrrrrtest_shell_string_with_spacess z0CommandsWithSpaces.test_shell_string_with_spacescCs|jtj|jdgdddS)Nrrrrrrrrtest_shell_sequence_with_spacessz2CommandsWithSpaces.test_shell_sequence_with_spacescCs|dtj|jdfdS)Nrrrrrrrtest_noshell_string_with_spacessz2CommandsWithSpaces.test_noshell_string_with_spacescCs|tj|jdgdS)Nrrrrrr!test_noshell_sequence_with_spacessz4CommandsWithSpaces.test_noshell_sequence_with_spaces) r$r%r&rr"rrrrrrXrrrrr s  rc@s4eZdZddZddZddZddZd d Zd S) ContextManagerTestscCstjtjddgtjtjd4}||jd||jdWdn1sV0Y| |jj | |jj dS)NrzAimport sys;sys.stdout.write('stdout');sys.stderr.write('stderr');rsstdoutsstderr) rr2rCrDr3rEr0rr1r%r&rTrrr test_pipe#s 0zContextManagerTests.test_pipecCsDttjddg}Wdn1s(0Y||jddS)Nrzimport sys; sys.exit(100)d)rr2rCrDrErrTrrrr0s  z#ContextManagerTests.test_returncodecCsTtjtjddgtjd(}|d||jdWdn1sF0YdS)Nrz2import sys;sys.exit(sys.stdin.read() == 'context')rhscontextrrrTrrrr7s  z*ContextManagerTests.test_communicate_stdinc Csb|tDtjttjtjd}Wdn1s60YWdn1sT0YdS)Nr)rMrrr2rr3rTrrrr?s z%ContextManagerTests.test_invalid_argscCsrtjttjtjdd}|}|jdtj| |j | t |j ddd||j d||jjdS)Nrc)r/r;rr)rr2rr3rr, __enter__r/rmrdrrMrR__exit__rEr%r&rTrrrtest_broken_pipe_cleanupFs z,ContextManagerTests.test_broken_pipe_cleanupN)r$r%r&rrrrrrrrrr!s  r__main__)?rrrrrrCrr5rr rSrjrrrrrrr rryr9rNrZ test.supportrrNr{r4rZPGOrrrr3rrNotADirectoryErrorr7rrDrrZTestCaser Exceptionr'r2r(r-rrrrrrYrvrrrrr$mainrrrrs               Y0 ! }d  +6