a 5êdghTã@s„dZddlmZddlmZe d¡ZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZe j e ¡ejd¡Ze ejdkd¡Zd d „Ze eƒd ¡ZGd d „d ejƒZGdd„dejƒZGdd„dƒZ e e!e dƒd¡Gdd„deje ƒƒZ"e e!e dƒd¡Gdd„deje ƒƒZ#e ej dkd¡Gdd„dejƒƒZ$dd„Z%e&d kr€e%ƒdS)!zTest posix functionsé)Úsupport)Úassert_python_okÚposixNz-dummy-symlinkìz(test is only meaningful on 32-bit buildsc Cs`ttdƒsdSzt d¡Wn>tyZ}z&|jtjkrFWYd}~dSWYd}~n d}~00dS)NÚsched_getschedulerFrT)ÚhasattrrrÚOSErrorÚerrnoÚENOSYS)Úe©r ú+/usr/local/lib/python3.9/test/test_posix.pyÚ_supports_scheds  $rzrequires POSIX scheduler APIc@s¬ eZdZdd„Zdd„Zdd„Ze ee dƒd¡d d „ƒZ e ee d ƒd ¡d d„ƒZ e ee dƒd¡dd„ƒZ e ee dƒd¡dd„ƒZ e ee dƒd¡dd„ƒZe ee dƒd¡dd„ƒZe ee dƒd¡dd„ƒZe ee dƒd ¡d!d"„ƒZe ee d#ƒd$¡d%d&„ƒZe ee d'ƒd(¡d)d*„ƒZe ee d+ƒd,¡d-d.„ƒZe eed/d0ƒejvd1¡e eed2ƒd3¡d4d5„ƒƒZe ee d6ƒd7¡e eed2ƒd3¡d8d9„ƒƒZe eed2ƒd3¡d:d;„ƒZe ee d<ƒd=¡d>d?„ƒZe ee d@ƒdA¡dBdC„ƒZe ee dDƒdE¡dFdG„ƒZe ee dDƒdE¡e ee dHƒdI¡dJdK„ƒƒZe ee dDƒdE¡edLdM„ƒƒZ e ee dNƒdO¡dPdQ„ƒZ!e ee dRƒdS¡dTdU„ƒZ"e ee dRƒdS¡e ee dVƒdW¡dXdY„ƒƒZ#e ee dRƒdS¡edZd[„ƒƒZ$e ee d\ƒd]¡d^d_„ƒZ%e ee d\ƒd]¡d`da„ƒZ&e ee dbƒdc¡ddde„ƒZ'e ee dbƒdc¡dfdg„ƒZ(e ej)ejvdh¡didj„ƒZ*e ej)ej+vdk¡dldm„ƒZ,e ee dnƒdo¡dpdq„ƒZ-e ee dnƒdo¡edrds„ƒƒZ.e ee dtƒdu¡dvdw„ƒZ/e ee dtƒdu¡edxdy„ƒƒZ0e ee dzƒd{¡d|d}„ƒZ1e ee d~ƒd¡d€d„ƒZ2e ee d‚ƒdƒ¡d„d…„ƒZ3e eed†ƒd‡¡e4 5dˆd‰dŠ¡d‹dŒ„ƒƒZ6e ee dƒdŽ¡dd„ƒZ7e ee d‘ƒd’¡d“d”„ƒZ8e ee d•ƒd–¡d—d˜„ƒZ9d™dš„Z:e ee d›ƒdœ¡ddž„ƒZ;e ee dŸƒoÜeed¨d©„Z?e ee dªƒd«¡d¬d­„ƒZ@e ee d®ƒd¯¡d°d±„ƒZAe ee d²ƒd³¡d´dµ„ƒZBe ee d¶ƒd·¡d¸d¹„ƒZCdºd»„ZDd¼d½„ZEd¾d¿„ZFdÀdÁ„ZGe e jHejvd¡dÃdÄ„ƒZIe ee dŃdÆ¡dÇdÈ„ƒZJe ee dɃdÊ¡dËdÌ„ƒZKe ee d̓dΡdÏdЄƒZLe ee dуdÒ¡dÓdÔ„ƒZMe eedÕƒdÖ¡e4 5dˆd‰dסdØdÙ„ƒƒZNe4jOe eedÕƒdÖ¡e4 5dˆd‰dסdÚdÛ„ƒƒƒZPe ee d܃dÝ¡dÞdß„ƒZQdàdá„ZRe ee dâƒdã¡däd儃ZSe ee dæƒdç¡dèd鄃ZTe ee dæƒdç¡dêd넃ZUdìdí„ZVdîdï„ZWe ee dðƒdñ¡dòdó„ƒZXe ee dôƒdõ¡e eeYdöƒd÷¡e eedøƒdù¡dúdû„ƒƒƒZZe eedüƒdý¡dþdÿ„ƒZ[e ej\ej]vd¡dd„ƒZ^e ej_ej]vd¡dd„ƒZ`e ejaej]vd¡dd„ƒZbe ejd?„ƒZezd@dA„ƒZ€ezdBdC„ƒZdDdE„Z‚e eedFƒdG¡dHdI„ƒZƒdJdK„Z„dLdM„Z…dNdO„Z†e eedPƒdQ¡dRdS„ƒZ‡d0S(TÚ PosixTestercCsDttjdƒ}| ¡tjg|_t ¡|_|j ¡t  ddt ¡dS)Núw+Úignorez.* potential security risk .*) ÚopenrÚTESTFNÚcloseÚteardown_filesZcheck_warningsÚ_warnings_managerÚ __enter__ÚwarningsÚfilterwarningsÚRuntimeWarning©ÚselfÚfpr r r ÚsetUp+s    ÿzPosixTester.setUpcCs*|jD]}t |¡q|j ddd¡dS©N)rrÚunlinkrÚ__exit__)rZ teardown_filer r r ÚtearDown5s  zPosixTester.tearDowncCs>gd¢}|D],}tt|dƒ}|dur |ƒ| t|d¡q dS)N)ÚctermidÚgetcwdÚgetcwdbÚunameÚtimesÚ getloadavgÚgetegidÚgeteuidÚgetgidÚ getgroupsÚgetpidÚgetpgrpÚgetppidÚgetuidÚsyncé)ÚgetattrrÚ assertRaisesÚ TypeError)rZNO_ARG_FUNCTIONSÚnameZ posix_funcr r r ÚtestNoArgFunctions:s  zPosixTester.testNoArgFunctionsÚ getresuidztest needs posix.getresuid()cCs2t ¡}| t|ƒd¡|D]}| |d¡qdS©Nér)rr8Ú assertEqualÚlenÚassertGreaterEqual)rZuser_idsÚvalr r r Útest_getresuidIszPosixTester.test_getresuidÚ getresgidztest needs posix.getresgid()cCs2t ¡}| t|ƒd¡|D]}| |d¡qdSr9)rr@r;r<r=)rZ group_idsr>r r r Útest_getresgidQszPosixTester.test_getresgidÚ setresuidztest needs posix.setresuid()cCs0t ¡}| tj|Ž¡| t ddd¡¡dS©Néÿÿÿÿ)rr8Ú assertIsNonerB)rÚcurrent_user_idsr r r Útest_setresuidYszPosixTester.test_setresuidcCs<t ¡}d|vr8|ddddf}|jttjg|¢RŽdS©Nrr2rD)rr8r4rrB)rrFZ new_user_idsr r r Útest_setresuid_exceptionasz$PosixTester.test_setresuid_exceptionÚ setresgidztest needs posix.setresgid()cCs0t ¡}| tj|Ž¡| t ddd¡¡dSrC)rr@rErJ)rÚcurrent_group_idsr r r Útest_setresgidjszPosixTester.test_setresgidcCs<t ¡}d|vr8|ddddf}|jttjg|¢RŽdSrH)rr@r4rrJ)rrKZ new_group_idsr r r Útest_setresgid_exceptionrsz$PosixTester.test_setresgid_exceptionÚ initgroupsztest needs os.initgroups()c CsØ| ttj¡| ttjd¡| ttjdd¡| ttjddtƒ¡t ¡dkrÔzt t ¡¡j }Wnt y‚t   d¡‚Yn0zt |d¡Wn4t yÈ}z| |jtj¡WYd}~nd}~00| d¡dS)Nr:Úfoorzneed a pwd entryé z+Expected OSError to be raised by initgroups)r4r5rrNÚobjectÚosr0ÚpwdÚgetpwuidÚpw_nameÚKeyErrorÚunittestÚSkipTestrr;r ÚEPERMÚfail)rr6r r r r Útest_initgroups{s  &zPosixTester.test_initgroupsÚstatvfsztest needs posix.statvfs()cCs| t tj¡¡dSr)Ú assertTruerr\rRÚcurdir©rr r r Ú test_statvfs”szPosixTester.test_statvfsÚfstatvfsztest needs posix.fstatvfs()cCsNttjƒ}z4| t | ¡¡¡| t | ¡¡¡W| ¡n | ¡0dSr) rrrr]rraÚfilenor\rrr r r Ú test_fstatvfs™s  zPosixTester.test_fstatvfsÚ ftruncateztest needs posix.ftruncate()cCsJttjdƒ}z.| d¡| ¡t | ¡d¡W| ¡n | ¡0dS)NrÚtestr) rrrÚwriteÚflushrrdrbrrr r r Útest_ftruncate£s   zPosixTester.test_ftruncateÚtruncateztest needs posix.truncate()cCsPttjdƒ"}| d¡| ¡Wdƒn1s40Yt tjd¡dS)NÚwrer)rrrrfrgrrirr r r Ú test_truncate¯s &zPosixTester.test_truncateÚexecveNz/test needs execve() to support the fd parameterÚforkztest needs os.fork()c Cs€t tjtj¡}z^t ¡}|dkrTt tj tj¡d¡t   |tjddgtj ¡nt j |ddWt |¡n t |¡0dS)Nrú-cÚpass©Úexitcode)rRrÚsysÚ executableÚO_RDONLYrmÚchdirÚpathÚsplitrrlÚenvironrÚ wait_processr)rrÚpidr r r Ú test_fexecve¶szPosixTester.test_fexecveÚwaitidztest needs posix.waitid()cCsht ¡}|dkrDt tj tj¡d¡t tjtjddgtj ¡n t  tj |tj ¡}|  ||j¡dS)Nrrnro)rRrmrurvrwrrrsrrlrxr|ÚP_PIDÚWEXITEDr;Úsi_pid)rrzÚresr r r Ú test_waitidÅs zPosixTester.test_waitidcCs4|jtddt dd„¡Wdƒn1s20Y|jtddtjddWdƒn1sl0Y|jtddtjdd Wdƒn1s¦0Y|jtddtjd d Wdƒn1sà0Y|jtd dtjddWdƒn1s0Y|jtd dtjdd Wdƒn1sX0Y|jtd dtjdd Wdƒn1s”0Y|jtd d"tjddd„dWdƒn1sÖ0Y|jtd d"tjdd„ddWdƒn1s0Yd}td|ƒdS)NzPositional args not allowed)ÚmsgcSsdSrr r r r r ÚÓóz3PosixTester.test_register_at_fork..zArgs must be callableé)ÚbeforeZthree)Úafter_in_childsFive)Úafter_in_parentzArgs must not be NonezInvalid arg was allowedcSsdS)Nr:r r r r r rƒâr„)r†rˆcSsdSrr r r r r rƒår„Ú)r†r‡a·if 1: import os r, w = os.pipe() fin_r, fin_w = os.pipe() os.register_at_fork(before=lambda: os.write(w, b'A')) os.register_at_fork(after_in_parent=lambda: os.write(w, b'C')) os.register_at_fork(after_in_child=lambda: os.write(w, b'E')) os.register_at_fork(before=lambda: os.write(w, b'B'), after_in_parent=lambda: os.write(w, b'D'), after_in_child=lambda: os.write(w, b'F')) pid = os.fork() if pid == 0: # At this point, after-forkers have already been executed os.close(w) # Wait for parent to tell us to exit os.read(fin_r, 1) os._exit(0) else: try: os.close(w) with open(r, "rb") as f: data = f.read() assert len(data) == 6, data # Check before-fork callbacks assert data[:2] == b'BA', data # Check after-fork callbacks assert sorted(data[2:]) == list(b'CDEF'), data assert data.index(b'C') < data.index(b'D'), data assert data.index(b'E') < data.index(b'F'), data finally: os.write(fin_w, b'!') rn)r4r5rRÚregister_at_forkr)rÚcoder r r Útest_register_at_forkÐs(,***,,,22#z!PosixTester.test_register_at_forkÚlockfztest needs posix.lockf()c Csrt tjtjtjB¡}zJt |d¡t |dtj¡t   |t j d¡t   |t j d¡Wt  |¡n t  |¡0dS)Nótestré)rRrrrÚO_WRONLYÚO_CREATrfÚlseekÚSEEK_SETrrÚF_LOCKÚF_ULOCKr©rÚfdr r r Ú test_lockf s zPosixTester.test_lockfÚpreadztest needs posix.pread()c Cs|t tjtjtjB¡}zTt |d¡t |dtj¡|  dt   |dd¡¡|  dt   |d¡¡Wt  |¡n t  |¡0dS)NrŽrsesr…r2ste)rRrrrÚO_RDWRr‘rfr’r“r;rr™Úreadrr–r r r Ú test_preads zPosixTester.test_preadÚpreadvztest needs posix.preadv()c Cszt tjtjtjB¡}zRt |d¡dd„dDƒ}| t  ||d¡d¡| gd¢t |ƒ¡Wt  |¡n t  |¡0dS)Nótest1tt2t3t5t6t6t8cSsg|] }t|ƒ‘qSr ©Ú bytearray©Ú.0Úir r r Ú *r„z+PosixTester.test_preadv..©ér:r…r:é ©st1tt2st3ts5t) rRrrrršr‘rfr;rrÚlistr)rr—Úbufr r r Ú test_preadv%s zPosixTester.test_preadvÚ RWF_HIPRIztest needs posix.RWF_HIPRIc Csât tjtjtjB¡}zºzLt |d¡dd„dDƒ}| t  ||dtj ¡d¡| gd¢t |ƒ¡Wn^t y€|  d¡YnDtyÂ}z,|jtjtjhvr¬t d ¡‚n‚WYd}~n d}~00Wt |¡n t |¡0dS) NržcSsg|] }t|ƒ‘qSr rŸr¡r r r r¤6r„z1PosixTester.test_preadv_flags..r¥r:r§r¨zpreadv2 not availablez0RWF_HIPRI is not supported by the current system)rRrrrršr‘rfr;rrr¬r©ÚNotImplementedErrorÚskipTestrr ÚEINVALÚENOTSUPrWrXr)rr—rªÚinstr r r Útest_preadv_flags0s   zPosixTester.test_preadv_flagsc Cs¦t tjtjtjB¡}z~tdƒgd}| t¡}t  ||d¡Wdƒn1sT0Y|  |j j t j ¡|  t|dƒdd¡Wt |¡n t |¡0dS©Néé€ró)rRrrrršr‘r r4rrr;Ú exceptionr r¯Úbytesr©rr—rªÚcmr r r Útest_preadv_overflow_32bitsFs ,z'PosixTester.test_preadv_overflow_32bitsÚpwriteztest needs posix.pwrite()c Cstt tjtjtjB¡}zLt |d¡t |dtj¡t   |dd¡|  dt   |d¡¡Wt  |¡n t  |¡0dS)NrŽróxxr2stxxtr)rRrrrršr‘rfr’r“rr¼r;r›rr–r r r Ú test_pwriteSs zPosixTester.test_pwriteÚpwritevztest needs posix.pwritev()c Cs”t tjtjtjB¡}zlt |d¡t |dtj¡t  |gd¢d¡}|  |d¡t |dtj¡|  dt   |d¡¡Wt  |¡n t  |¡0dS)Nr½r©stest1stt2st3r…r§s xxtest1tt2t3éd)rRrrrršr‘rfr’r“r¿r;rr›r©rr—Únr r r Ú test_pwritev^s  zPosixTester.test_pwritevz os.RWF_SYNCztest needs os.RWF_SYNCc Cs˜t tjtjtjB¡}zpt |d¡t |dtj¡t  |gd¢dtj ¡}|  |d¡t |dtj¡|  dt   |d¡¡Wt |¡n t |¡0dS)Nr½rrÀr…r§s xxtest1tt2rÁ)rRrrrršr‘rfr’r“r¿ZRWF_SYNCr;rr›rrÂr r r Útest_pwritev_flagsls  zPosixTester.test_pwritev_flagsc CsŠt tjtjtjB¡}zb| t¡(}t |ddgdd¡Wdƒn1sP0Y|  |j j t j ¡Wt  |¡n t  |¡0dS)Nóxr´rµr)rRrrrršr‘r4rr¿r;r·r r¯r©rr—rºr r r Útest_pwritev_overflow_32bits{s  6z(PosixTester.test_pwritev_overflow_32bitsÚposix_fallocatez"test needs posix.posix_fallocate()c Cs”t tjtjtjB¡}zlzt |dd¡WnJtyt}z2|j t j kr^t j   d¡r^t d¡‚n‚WYd}~n d}~00Wt |¡n t |¡0dS)Nrr§)ZsunosÚfreebsdÚnetbsdZopenbsdZ gnukfreebsdz test may fail on ZFS filesystems)rRrrrrr‘rrÉrr r¯rrÚplatformÚ startswithrWrXr)rr—r±r r r Útest_posix_fallocate†sÿ z PosixTester.test_posix_fallocatec CsJzt ddd¡Wn2tyD}z|jtjkr0‚WYd}~n d}~00dS)NéÖÿÿÿrr§)rrÉrr ÚEBADF©rr±r r r Útest_posix_fallocate_errnošs  z&PosixTester.test_posix_fallocate_errnoÚ posix_fadvisez test needs posix.posix_fadvise()c CsBt tjtj¡}z t |ddtj¡Wt |¡n t |¡0dS©Nr) rRrrrrtrrÓÚPOSIX_FADV_WILLNEEDrr–r r r Útest_posix_fadvise£szPosixTester.test_posix_fadvisec CsNzt dddtj¡Wn2tyH}z|jtjkr4‚WYd}~n d}~00dS)NrÏr)rrÓrÕrr rÐrÑr r r Útest_posix_fadvise_errno¬s  z$PosixTester.test_posix_fadvise_errnoz!test needs fd support in os.utimec CsRt ¡}t tjtj¡}z&t |¡t |d¡| t tj|d¡| t tj||df¡| t tj|d|f¡t |t |ƒt |ƒf¡t |||f¡|jt tj|||f||fd|jt tj||dfdd|jt tj|d|dfdt |t |ƒt |t |ƒdƒf¡tj|t |ƒt |t |ƒdƒfdWt  |¡n t  |¡0dS)N©NN)ÚnsrçeÍÍA) ÚtimerRrrrrtrÚutimer4r5ÚintÚ ValueErrorr)rÚnowr—r r r Útest_utime_with_fdµs   $(zPosixTester.test_utime_with_fdz.test needs follow_symlinks support in os.utimecCs²t ¡}tjtjddd|jttjtjddd|jttjtj|dfdd|jttjtjd|fddtjtjt|ƒt|ƒfddtjtj||fddtjtjdddS)NF©Úfollow_symlinksrØ©rÛrrÜrrr4r5rÝ©rrßr r r Útest_utime_nofollow_symlinksÊsz(PosixTester.test_utime_nofollow_symlinksÚwritevztest needs posix.writev()c Cs¢t tjtjtjB¡}zzt |d¡}| |d¡t |dtj ¡| dt   |d¡¡zt  |g¡}Wnt yvYn0| |d¡Wt  |¡n t  |¡0dS)NrÀr§ró test1tt2t3)rRrrrršr‘rær;r’r“rr›rr)rr—rÃÚsizer r r Ú test_writevÕs   zPosixTester.test_writevc Csˆt tjtjtjB¡}z`| t¡&}t |ddgd¡Wdƒn1sN0Y|  |j j t j ¡Wt  |¡n t  |¡0dS)NrÆr´rµ)rRrrrršr‘r4rrær;r·r r¯rrÇr r r Útest_writev_overflow_32bitsës  4z'PosixTester.test_writev_overflow_32bitsÚreadvztest needs posix.readv()c Cs¾t tjtjtjB¡}z–t |d¡t |dtj¡dd„dDƒ}|  t   ||¡d¡|  gd¢dd„|Dƒ¡zt   |g¡}Wnt y’Yn0|  |d¡Wt  |¡n t  |¡0dS) NrçrcSsg|] }t|ƒ‘qSr rŸr¡r r r r¤ür„z*PosixTester.test_readv..r¥r§rÀcSsg|] }t|ƒ‘qSr )r¸r¡r r r r¤þr„)rRrrrršr‘rfr’r“r;rrërr)rr—rªrèr r r Ú test_readvös  zPosixTester.test_readvc Cs¤t tjtjtjB¡}z|tdƒgd}| t¡}t  ||¡Wdƒn1sR0Y|  |j j t j ¡|  t|dƒdd¡Wt |¡n t |¡0dSr³)rRrrrršr‘r r4rrër;r·r r¯r¸rr¹r r r Útest_readv_overflow_32bits s *z&PosixTester.test_readv_overflow_32bitsÚdupztest needs posix.dup()cCsJttjƒ}z0t | ¡¡}| |t¡t  |¡W|  ¡n |  ¡0dSr) rrrrrîrbÚassertIsInstancerÝrRr)rrr—r r r Útest_dups    zPosixTester.test_dupÚconfstrztest needs posix.confstr()cCs.| ttjd¡| tt d¡ƒdkd¡dS)NZ CS_garbageÚCS_PATHrT)r4rÞrrñr;r<r_r r r Ú test_confstr$szPosixTester.test_confstrÚdup2ztest needs posix.dup2()cCsTttjƒ}ttjƒ}z(t | ¡| ¡¡W| ¡| ¡n| ¡| ¡0dSr)rrrrrôrbr)rÚfp1Úfp2r r r Ú test_dup2*s   ÿzPosixTester.test_dup2Ú O_CLOEXECzneeds os.O_CLOEXECr…éécCs8t tjtjtjB¡}| tj|¡| t  |¡¡dSr) rRrrrrtrøÚ addCleanuprÚ assertFalseÚget_inheritabler–r r r Útest_oscloexec5szPosixTester.test_oscloexecÚO_EXLOCKztest needs posix.O_EXLOCKcCsžt tjtjtjBtjB¡}| ttjtjtjtjBtj B¡t  |¡t t dƒršt tjtjtj BtjB¡}| ttjtjtjtjBtj B¡t  |¡dS)NÚO_SHLOCK)rRrrrrrÿr‘r4rÚ O_NONBLOCKrrrrr–r r r Ú test_osexlock<sÿÿ  ÿÿzPosixTester.test_osexlockrztest needs posix.O_SHLOCKcCs¢t tjtjtjBtjB¡}t tjtjtjBtjB¡}t |¡t |¡tt dƒržt tjtjtjBtjB¡}|  t tjtjtj tj BtjB¡t |¡dS)Nrÿ)rRrrrrrr‘rrrr4rrtrÿr)rÚfd1Úfd2r—r r r Ú test_osshlockLs ÿÿ   ÿÿzPosixTester.test_osshlockÚfstatztest needs posix.fstat()cCshttjƒ}zN| t | ¡¡¡| t | ¡¡¡| t dtjt | ¡ƒ¡W|  ¡n |  ¡0dS©Nz4should be string, bytes, os.PathLike or integer, not) rrrr]rrrbÚstatÚassertRaisesRegexr5Úfloatrrr r r Ú test_fstat]s þzPosixTester.test_fstatc Cs”| t tj¡¡| t t tj¡¡¡| tdtjt t tj¡ƒ¡|  t dtjd¡|  t dtjt tjƒ¡|  t dtjt t tj¡ƒ¡dSr) r]rrrrrRÚfsencodeZassertWarnsRegexÚDeprecationWarningr r r5r©r_r r r Ú test_statks$þþ þþzPosixTester.test_statÚmkfifozdon't have mkfifo()c Csxt tj¡zt tjtjtjB¡Wn2tyX}z|  d|¡WYd}~n d}~00|  t  t tj¡j ¡¡dS)Núposix.mkfifo(): %s) rr rrrrÚS_IRUSRÚS_IWUSRÚPermissionErrorr®r]ÚS_ISFIFOÚst_mode)rr r r r Ú test_mkfifo|s  $zPosixTester.test_mkfifoÚmknodÚS_IFIFOzdon't have mknod()/S_IFIFOc Csôt tj¡tjtjBtjB}zt tj|d¡Wn>t yp}z&|  |j t j t j t jf¡WYd}~n$d}~00| t t tj¡j¡¡t tj¡ztjtj|dddWn>t yî}z&|  |j t j t j t jf¡WYd}~n d}~00dS)Nr)rvÚmodeZdeviceÚdir_fd)rr rrrrrrrrÚassertInr rYr¯ÚEACCESr]rr)rrr r r r Ú test_mknod…s 0  ÿ zPosixTester.test_mknodÚmakedevztest needs posix.makedev()cCs`t tj¡}|j}| |t¡| |d¡t |¡}| |t¡| |d¡|  t |¡|¡|  t tjt |ƒ¡|  t tj¡|  t tftjd¡t |¡}| |t¡| |d¡|  t |¡|¡|  t tjt |ƒ¡|  t tj¡|  t tftjd¡|  t ||¡|¡|  t tjt |ƒ|¡|  t tj|t |ƒ¡|  t tj|¡|  t tj¡dS)NrrD)rrrrÚst_devrïrÝr=Úmajorr;r4r5r rÞÚ OverflowErrorÚminorr)rÚstÚdevr r"r r r Ú test_makedevs.         zPosixTester.test_makedevc s€‡‡‡fdd„}t ¡}t ¡}|ˆ||ƒ|||ƒ|ˆd|ƒ|||ƒ|ˆ|dƒ|||ƒ|dkr²d}|ˆ||ƒ|||ƒ|ˆddƒ|||ƒ|ˆ||ƒ|||ƒnzt ¡dvrÊt d¡‚nbˆ t|ˆdd¡|||ƒˆ t|ˆdd¡|||ƒdt  ¡vr,ˆ t|ˆdd¡|||ƒt t fD]F}ˆ t |ˆ||ƒ|¡|||ƒˆ t |ˆ|||ƒ¡|||ƒq4dS) z/Common code for chown, fchown and lchown tests.cs0ˆdur,ˆˆƒ}ˆ |j|¡ˆ |j|¡dSr)r;Úst_uidÚst_gid)ÚuidÚgidr©Ú first_paramrÚ stat_funcr r Ú check_stat¼sz6PosixTester._test_all_chown_common..check_statrDrl)zHP-UXZSunOSz1Skipping because of non-standard chown() behaviorN) rRr0r+rÌÚsystemrWrXr4rr,Ústrr r5) rZ chown_funcr+r,r-r(r)Z big_valueÚtr r*r Ú_test_all_chown_commonºs>                   z"PosixTester._test_all_chown_commonÚchownztest needs os.chown()cCsFt tj¡| ttjtjdd¡t tj¡|  tjtjtj ¡dSrC) rRr rrr4rrr2Úcreate_empty_filer1rr_r r r Ú test_chownõs  zPosixTester.test_chownÚfchownztest needs os.fchown()cCsTt tj¡ttjdƒ}z,| ¡}| tj|t tddƒ¡W|  ¡n |  ¡0dS)Nrjr) rRr rrrrbr1rr5r3r)rZ test_filer—r r r Ú test_fchownÿs    ÿzPosixTester.test_fchownÚlchownztest needs os.lchown()cCs8t tj¡t ttj¡| tjtjt tddƒ¡dS)NÚlstat) rRr rrÚsymlinkÚ_DUMMY_SYMLINKr1rr7r3r_r r r Ú test_lchown s    ÿzPosixTester.test_lchownruztest needs posix.chdir()cCs"t tj¡| ttjtj¡dSr)rrurRr^r4rrrr_r r r Ú test_chdirs zPosixTester.test_chdircCs| tjt tj¡¡dSr)rrrrÚlistdirrRr^r_r r r Ú test_listdirszPosixTester.test_listdircCs| tjt ¡¡dSr)rrrrr=r_r r r Útest_listdir_defaultsz PosixTester.test_listdir_defaultcCs| t tj¡t d¡¡dS©Nó.)rrRr rrrr=r_r r r Útest_listdir_bytes!szPosixTester.test_listdir_bytesc CsxttfD]j}| t¡t |dƒ¡}Wdƒn1s:0Y| t t j ¡|¡|D]}|  t |ƒt ¡q\qdSr@)r Ú memoryviewZ assertWarnsr rr=rrRr rrZassertIsÚtyper¸)rÚclsÚnamesr6r r r Útest_listdir_bytes_like&s   ,z#PosixTester.test_listdir_bytes_likez)test needs fd support for posix.listdir()cCsdt t ¡tj¡}| tj|¡| tt d¡ƒtt |¡ƒ¡| tt d¡ƒtt |¡ƒ¡dS)NÚ.) rrr$rtrûrr;Úsortedr=©rÚfr r r Útest_listdir_fd.s  þ  þzPosixTester.test_listdir_fdÚaccessztest needs posix.access()cCs| t tjtj¡¡dSr)r]rrMrrrRÚR_OKr_r r r Ú test_access=szPosixTester.test_accessÚumaskztest needs posix.umask()cCs$t d¡}| |t¡t |¡dSrÔ)rrPrïrÝ)rZold_maskr r r Ú test_umaskAs  zPosixTester.test_umaskÚstrerrorztest needs posix.strerror()cCs| t d¡¡dSrÔ)r]rrRr_r r r Ú test_strerrorGszPosixTester.test_strerrorÚpipeztest needs posix.pipe()cCs$t ¡\}}t |¡t |¡dSr)rrTrRr)rÚreaderÚwriterr r r Ú test_pipeLs  zPosixTester.test_pipeÚpipe2ztest needs os.pipe2()écCsö| ttjd¡| ttjdd¡t d¡\}}t |¡t |¡t tjtjB¡\}}| tj|¡| tj|¡| t  |¡¡| t  |¡¡| t  |¡¡| t  |¡¡| t tj |d¡zt  |dtj¡Wnt yðYn0dS)NZDEADBEEFrr2rÆ)r4r5rRrXrrørrûrürýÚ get_blockingrr›rfrZ PIPE_MAX_SIZE)rÚrrjr r r Ú test_pipe2Rs"   zPosixTester.test_pipe2cCs8ddl}| ttj|jd¡| ttj|jd¡dS©Nrr2)Ú _testcapir4r!rRrXZINT_MAXZUINT_MAX)rr^r r r Útest_pipe2_c_limitsnszPosixTester.test_pipe2_c_limitsrÜztest needs posix.utime()cCsŠt ¡}t tjd¡| ttjtjd¡| ttjtj|df¡| ttjtjd|f¡t tjt|ƒt|ƒf¡t tj||f¡dS)NrØrãrär r r Ú test_utimewszPosixTester.test_utimec Ks t |¡}| t|dƒ¡|jtjB}z|||fi|¤ŽWn@ty|}z(|jtjkrZ‚d}|  |¡WYd}~n d}~00zvt |¡}|  |jtjB|j¡zt |dƒ} Wn4tyâ} z|  | jtj ¡WYd} ~ n d} ~ 00Wt  ||j¡nt  ||j¡0dS)NÚst_flagsú2chflag UF_IMMUTABLE not supported by underlying fsr)rRrr]rraÚ UF_IMMUTABLErr Ú EOPNOTSUPPr®r;rrYrÚchflags) rZ chflags_funcZ target_fileÚkwargsr#ÚflagsÚerrr‚Znew_str—r r r r Ú_test_chflags_regular_files$     (z&PosixTester._test_chflags_regular_filereztest needs os.chflags()cCs| tjtj¡dSr)rirrerrr_r r r Ú test_chflags™szPosixTester.test_chflagsÚlchflagsztest needs os.lchflags()cCs(| tjtj¡|jtjtjdddS©NFrá)rirrkrrrer_r r r Útest_lchflags_regular_filesz&PosixTester.test_lchflags_regular_filec Cst tj¡}| t|dƒ¡t tjt¡|j  t¡t  t¡}dd„}t j |fD]¼}|j tjB}z|t|ƒWn@ty°}z(|jtjkrŽ‚d}| |¡WYd}~n d}~00zLt tj¡}t  t¡} | |j |j ¡| |j tjB| j ¡W|t|j ƒqR|t|j ƒ0qRdS)NracSstj||ddSrl)rre)rvrgr r r Úchflags_nofollow¬sz;PosixTester.test_lchflags_symlink..chflags_nofollowrb)rRrrrr]rr9r:rÚappendr8rrkrarcrr rdr®r;) rZ testfn_stZdummy_symlink_strnÚfnrgrhr‚Z new_testfn_stZnew_dummy_symlink_str r r Útest_lchflags_symlink¢s.        ÿz!PosixTester.test_lchflags_symlinkcCsLtjdkrt}nt}tj ¡D](\}}| t|ƒ|¡| t|ƒ|¡qdS)NÚnt) rRr6r/r¸rrxÚitemsr;rD)rZ item_typeÚkÚvr r r Ú test_environÃs  zPosixTester.test_environcCsL| t¡t dd¡Wdƒn1s,0Y| t¡t dd¡Wdƒn1sb0Y| t¡t dd¡Wdƒn1s˜0Y| t¡t dd¡Wdƒn1sÎ0Y| t¡t d d ¡Wdƒn1s0Y| t¡t d d ¡Wdƒn1s>0YdS) NzFRUITVEGETABLEZcabbagesFRUITVEGETABLEscabbageZFRUITzorangeVEGETABLE=cabbagesFRUITsorangeVEGETABLE=cabbagez FRUIT=ORANGEZlemons FRUIT=ORANGEslemon)r4rÞrRÚputenvr_r r r Ú test_putenvÌs * * * * , zPosixTester.test_putenvr$ztest needs posix.getcwd()c sd}t ¡}tj tj¡d}zVzt |¡t |¡Wn$YWt |¡t |¡dS0Wt |¡t |¡nt |¡t |¡0dS)Nz8getcwd-test-directory-0123456789abcdef-01234567890abcdefz.getcwdrc sŠzt |¡Wnt d¡‚Yn0t |¡z>t ¡|dkrXˆ||t|ƒdƒWt d¡t |¡nt d¡t |¡0dS)Nz?mkdir cannot create directory sufficiently deep for getcwd testir2z..)rRÚmkdirrWrXrur$r<Úrmdir)ÚdirnameZcurrent_path_length©Ú_create_and_do_getcwdr r r}és   ÿ zEPosixTester.test_getcwd_long_pathnames.._create_and_do_getcwd) rRr$rvÚabspathrrryruÚrmtree)rr{r^Ú base_pathr r|r Útest_getcwd_long_pathnamesÚs"   ë  ÿ z&PosixTester.test_getcwd_long_pathnamesÚ getgrouplistztest needs posix.getgrouplist()rTztest needs pwd.getpwuid()r0ztest needs os.getuid()cCs<t t ¡¡d}t t ¡¡d}| |t ||¡¡dS)Nrr:)rSrTrRr0rrr‚)rÚuserÚgroupr r r Útest_getgrouplistþszPosixTester.test_getgrouplistr)ztest needs os.getegid()cCst d¡$}| ¡ ¡}| ¡}Wdƒn1s40Yztdd„| ¡Dƒƒ}Wntyptƒ}Yn0|dus~|sˆt  d¡‚t j dkrÖddl }|  d¡p¦d}td d„| d ¡dd …Dƒƒd krÖt  d ¡‚| t ¡¡}| | pú|t ¡hk¡dS)Nzid -G 2>/dev/nullcss|]}t|ƒVqdSr©rÝ)r¢Úgr r r Ú r„z-PosixTester.test_getgroups..zneed working 'id -G'ÚdarwinrZMACOSX_DEPLOYMENT_TARGETz10.0css|]}t|ƒVqdSrr†)r¢rÃr r r rˆr„rHr…)r§rùz$getgroups(2) is broken prior to 10.6)rRÚpopenr›ÚstriprÚsetrwrÞrWrXrrrÌÚ sysconfigZget_config_varÚtupleÚsymmetric_differencerr,r]r))rZidgÚgroupsÚretZ idg_groupsrZdtZsymdiffr r r Útest_getgroupss   &     $ zPosixTester.test_getgroupsz)test needs dir_fd support for os.access()c CsLt t ¡tj¡}z(| tjtjtj |d¡Wt  |¡n t  |¡0dS©N©r) rrr$rtr]rMrrrRrNrrJr r r Útest_access_dir_fd$szPosixTester.test_access_dir_fdz'test needs dir_fd support in os.chmod()c Cs†t tjtj¡t t ¡tj ¡}zRtjtjtjtj B|dt tj¡}|  |dtj @tjtj B¡Wt  |¡n t  |¡0dS)Nr”r)rRÚchmodrrrrrrr$rtrr;ÚS_IRWXUr)rrKÚsr r r Útest_chmod_dir_fd,s  zPosixTester.test_chmod_dir_fdz'test needs dir_fd support in os.chown()c Csft tj¡t tj¡t t ¡tj¡}z*tjtjt   ¡t   ¡|dWt  |¡n t  |¡0dSr“) rr rr3rrr$rtr2rRr0r+rrJr r r Útest_chown_dir_fd9s   zPosixTester.test_chown_dir_fdz&test needs dir_fd support in os.stat()c Cst tj¡ttjdƒ}| d¡Wdƒn1s80Yt t ¡tj¡}z t tj¡}tjtj|d}|  ||¡tjtjdd}|  ||¡|j t dtjtjt ¡d|j t dtjtjt |ƒd|j ttjtjddWt |¡n t |¡0dS)Nrjú testline r”zshould be integer or None, notl Fµx:^V)rr rrrfrr$rtrr;r r5r r4r!r)rÚoutfilerKÚs1Ús2r r r Útest_stat_dir_fdDs( (   ÿÿ ÿzPosixTester.test_stat_dir_fdz'test needs dir_fd support in os.utime()c Cs¤t t ¡tj¡}z~t ¡}tjtjd|dtjtj|d|jt tjtj||d|jt tjtjd|d|jt tjtj|df|d|jt tjtjd|f|d|jt tjtj|df|dtjtjt |ƒt |ƒf|dtjtj||f|dtjtjt |ƒt |t |ƒdƒf|dtjtj|t |ƒt |t |ƒdƒfdt jt j vr†ztjtjd|dWnt y„Yn0Wt |¡n t |¡0dS)Nr”rØÚxrÚ)rr'F)râr)rrr$rtrÛrÜrrr4r5rÝrRÚsupports_follow_symlinksrÞr)rrKrßr r r Útest_utime_dir_fdZs0ÿ ÿzPosixTester.test_utime_dir_fdz&test needs dir_fd support in os.link()c CsÌt t ¡tj¡}z˜ztjtjtjd||dWn2tyd}z| d|¡WYd}~n2d}~00|  t  tj¡dt  tjd¡d¡Wt  |¡t  tjd¡nt  |¡t  tjd¡0dS)NÚlink©Ú src_dir_fdÚ dst_dir_fdzposix.link(): %sr2) rrr$rtr£rrrr®r;rrr ©rrKr r r r Útest_link_dir_fdxs$ÿ ÿ zPosixTester.test_link_dir_fdz'test needs dir_fd support in os.mkdir()c Csvt t ¡tj¡}zBtjtjd|dt tjd¡Wt |¡t  tjd¡nt |¡t  tjd¡0dS)NÚdirr”) rrr$rtryrrrrrrJr r r Útest_mkdir_dir_fd‡s ÿ zPosixTester.test_mkdir_dir_fdzAtest requires both stat.S_IFIFO and dir_fd support for os.mknod()c CsÂt tj¡tjtjBtjB}t t  ¡tj ¡}z€ztj tj|d|dWn>t yˆ}z&|  |jtjtjtjf¡WYd}~n$d}~00| t t tj¡j¡¡Wt |¡n t |¡0dS)Nrr”)rr rrrrrrrr$rtrrrr rYr¯rr]rrr)rrrKr r r r Útest_mknod_dir_fd‘s 0zPosixTester.test_mknod_dir_fdz&test needs dir_fd support in os.open()c Cs¼t tj¡ttjdƒ}| d¡Wdƒn1s80Yt t ¡tj¡}tjtjtj|d}z8t |d¡j dd}|  d|¡Wt  |¡t  |¡nt  |¡t  |¡0dS)Nrjr›r”é zutf-8)Úencoding) rr rrrfrr$rtr›Údecoder;r)rrœÚaÚbr€r r r Útest_open_dir_fd¤s (  ÿ zPosixTester.test_open_dir_fdz*test needs dir_fd support in os.readlink()c CsŽt tjtjd¡t t ¡tj¡}zF| t  tjd¡tj tjd|d¡Wt  tjd¡t  |¡nt  tjd¡t  |¡0dS©Nr£r”) rRr9rrrrr$rtr;Úreadlinkr rrJr r r Útest_readlink_dir_fd²sÿ ÿz PosixTester.test_readlink_dir_fdz(test needs dir_fd support in os.rename()c Csœt tj¡t tjd¡t t ¡tj¡}z\ztjtjdtj||dWn"t tjdtj¡‚Yn0t  tj¡Wt  |¡n t  |¡0dS)NZrenr¤) rr rr3rrr$rtÚrenamerrrJr r r Útest_rename_dir_fd½s zPosixTester.test_rename_dir_fdÚSIGCHLDz2CLD_XXXX be placed in si_code for a SIGCHLD signalÚ waitid_resultztest needs os.waitid_resultcCs(tjtjtjtjtjtjdSr)rRÚ CLD_EXITEDÚ CLD_KILLEDÚ CLD_DUMPEDÚ CLD_TRAPPEDÚ CLD_STOPPEDÚ CLD_CONTINUEDr_r r r Útest_cld_xxxx_constantsÌs z#PosixTester.test_cld_xxxx_constantsz)test needs dir_fd support in os.symlink()c Cs„t t ¡tj¡}zPtjtjtjd|d| t tjd¡tj¡Wt  |¡t  tjd¡nt  |¡t  tjd¡0dSr²) rrr$rtr9rrr;r³rr rJr r r Útest_symlink_dir_fdÖs ÿ zPosixTester.test_symlink_dir_fdz(test needs dir_fd support in os.unlink()c Cs t t ¡tj¡}t tjd¡t tjd¡z\ztjtjd|dWnt tjd¡‚Yn0|  t tjtjd¡Wt  |¡n t  |¡0dS)NÚdelr”r£) rrr$rtrr3rrr r4rrrJr r r Útest_unlink_dir_fdàszPosixTester.test_unlink_dir_fdz(test needs dir_fd support in os.mkfifo()c Csªt tj¡t t ¡tj¡}zzztjtjtj tj B|dWn2t yp}z|  d|¡WYd}~n d}~00|  t t tj¡j¡¡Wt |¡n t |¡0dS)Nr”r)rr rrrr$rtrrrrrr®r]rrrr§r r r Útest_mkfifo_dir_fdïs  ÿ $zPosixTester.test_mkfifo_dir_fdÚ sched_yieldzdon't have scheduling supportÚsched_setaffinityz!don't have sched affinity supportcCs t ¡dSr)rrÄr_r r r Útest_sched_yieldszPosixTester.test_sched_yieldÚsched_get_priority_maxz!requires sched_get_priority_max()cCsltj}t |¡}t |¡}| |t¡| |t¡| ||¡tjdkrh|  t tjd¡|  t tjd¡dS)Nr‰iéÿÿÿ) rÚSCHED_RRÚsched_get_priority_minrÇrïrÝr=rrrÌr4r)rZpolÚloÚhir r r Útest_sched_prioritys      zPosixTester.test_sched_priorityc CsÄdd„tj ¡Dƒ}t d¡}| ||¡zt t ¡¡}Wn2tyn}z|jtj krZ‚WYd}~nd}~00| ||¡|  ttjd¡|  ttj d¡t  d¡}|  |j t¡tj d¡s*zt d||¡t d|¡Wn6ty}z|jtj kr‚WYd}~n d}~00|  ttjd|¡|  ttjd||¡|  ttjd|d¡|  ttjdd¡t d¡}|  ttjd|¡d}t |¡}|  ttjd|¡tj| d}|  ttjd|¡dS) NcSsg|]\}}| d¡r|‘qS)ZSCHED_©rÍ)r¢r6Zschedr r r r¤s  ÿzDPosixTester.test_get_and_set_scheduler_and_param..rrD©rÊrËé+lœÿÇ)Úsched_priority)rÚ__dict__rsrrrRr/rr rYr4Úsched_getparamrïrÐrÝrrrÌrÍÚsched_setschedulerÚsched_setparamr5Ú sched_paramr!)rZpossible_schedulersZmineÚparentr ZparamZlarger r r Ú$test_get_and_set_scheduler_and_params>       z0PosixTester.test_get_and_set_scheduler_and_paramÚsched_rr_get_intervalz no functionc Cstzt d¡}Wn<tyJ}z$|jtjkr,‚| d¡WYd}~n d}~00| |t¡| |d¡|  |d¡dS)Nrz only works on SCHED_RR processesggð?) rrØrr r¯r®rïr r=Ú assertLess)rÚintervalr r r r Útest_sched_rr_get_interval@s    z&PosixTester.test_sched_rr_get_intervalcCsht d¡}| |t¡| t|ƒd¡| ttjd¡|D](}| |t¡| |d¡|  |d¡q:dS)Nrr2rDr) rÚsched_getaffinityrïrŒr=r<r4rrÝrÙ)rÚmaskZcpur r r Útest_sched_getaffinityOs    z"PosixTester.test_sched_getaffinitycCs¨t d¡}t|ƒdkr| ¡t d|¡| t d¡|¡| ttjdg¡| ttjddg¡| ttjdt t dƒ¡| t tjddd>g¡| ttjd|¡dS)Nrr2iöÿÿÿZ0Xé€rD) rrÜr<ÚpoprÅr;r4rrÞÚmaprÝr!)rrÝr r r Útest_sched_setaffinityZs   z"PosixTester.test_sched_setaffinitycCstjtjtjtjdSr)rÚ RTLD_LAZYÚRTLD_NOWÚ RTLD_GLOBALÚ RTLD_LOCALr_r r r Útest_rtld_constantshszPosixTester.test_rtld_constantsÚ SEEK_HOLEz(test needs an OS that reports file holesc CsÞttjdƒ¾}| d¡| ¡| ¡}| ¡}znt|ƒD]4}| |t   ||t j ¡¡|  |t   ||t j ¡¡q:| tt j ||t j ¡| tt j ||t j ¡Wntyºt d¡‚Yn0Wdƒn1sÐ0YdS)Nzr+bshellozOSError raised!)rrrrfrgÚtellrbÚranger;rRr’Ú SEEK_DATAZassertLessEqualrèr4rrWrX)rrrèZfnor£r r r Ú test_fs_holesos    zPosixTester.test_fs_holesc CsšdD]}tt|dƒ}|durqdtjfD]\}z|d|ƒWq(ty‚}z0| d |¡t|ƒ¡WYd}~qWYd}~q(d}~00q(| d|¡qdS)zf Test functions that call path_error2(), providing two filenames in their exceptions. )rµÚreplacer£NZnoodly2Zdoesnotexistfilenamez'doesnotexistfilename' -> '{}'z#No valid path_error2() test for os.) r3rRrrrrÚformatr/rZ)rr6ÚfunctionÚdstr r r r Útest_path_error2Šs &zPosixTester.test_path_error2c Csêtj}|d}| tj|¡t |¡d}zT| t¡$t |tjtj B¡}Wdƒn1s`0YW|dur”t  |¡n|dur’t  |¡0|  tj   |¡¡| ttj|¡|  tj   |¡¡t|dƒ  ¡| ttj|¡dS)NúÚwb)rrrûr r4rÞrRrrr‘rrürvÚexistsryr©rrpZ fn_with_NULr—r r r Útest_path_with_null_characterœs"  4 ÿ z)PosixTester.test_path_with_null_characterc Csðt tj¡}|d}| tj|¡t |¡d}zT| t¡$t |tj tj B¡}Wdƒn1sf0YW|duršt  |¡n|dur˜t  |¡0|  tj  |¡¡| ttj|¡|  tj  |¡¡t|dƒ  ¡| ttj|¡dS)Nr¶ró)rRr rrrûr r4rÞrrr‘rrürvrôryrrõr r r Útest_path_with_null_byte®s"   4 ÿ z$PosixTester.test_path_with_null_byteÚ pidfd_openzpidfd_open unavailablecCs–| t¡}t d¡Wdƒn1s*0Y|jjtjkrL| d¡t|jt ƒrj| d|j›¡|  |jjtj ¡t  t t  ¡d¡¡dS)NrDz"system does not support pidfd_openzpidfd_open syscall blocked: r)r4rrRrør·r r r®Ú isinstancerr;r¯rr-)rrºr r r Útest_pidfd_openÀs (  zPosixTester.test_pidfd_open)ˆÚ__name__Ú __module__Ú __qualname__rr"r7rWÚ skipUnlessrrr?rArGrIrLrMr[r`rcrhrkr3rRÚ supports_fdr{rrŒr˜rœr«r²Ú requires_32br»r¾rÄrÅrÈrÎrÒrÖr×rÜràr¡rårérêrìrírðrór÷rZrequires_linux_versionrþrrr rrrrr%r1r4r6r;r<r>r?rBrGr=rLrOrQrSrWr\Z cpython_onlyr_r`rirjrmrqrvrxrrSr…r’rMÚsupports_dir_fdr•r–r™r2ršrŸr¢r£r¨ryrªrr«rr±r³r´rµr¶Úsignalr¿r9rÀr rÂrrÃZrequires_sched_hZrequires_sched_affinityrÆrÌÚrequires_schedr×rÛrÞrârçrìrñrör÷rúr r r r r)s  ÿ  ÿ  ÿ  ÿ  ÿ  ÿ  ÿ  ÿ  ÿ  ÿ     <         ÿ  ÿ  ÿ  ÿ       ÿ ÿ  ÿ    ÿ  ÿ  ÿ  ÿ  ;    ÿ    ÿ           #    ÿ    ÿÿÿ (  ÿ   rc@sPeZdZdd„Zdd„Ze eedƒd¡dd„ƒZ e eed ƒd ¡d d „ƒZ d S)ÚPosixGroupsTestercCsLt ¡dkrt d¡‚ttdƒs*t d¡‚tjdkr>t d¡‚t ¡|_dS)Nrznot enough privilegesr,zneed posix.getgroupsr‰zgetgroups(2) is broken on OSX) rr0rWrXrrrrÌr,Ú saved_groupsr_r r r rÍs      zPosixGroupsTester.setUpcCsHttdƒrt |j¡n,ttdƒrDt t ¡¡j}t ||jd¡dS)NÚ setgroupsrNr) rrrrrSrTr0rUrN©rr6r r r r"Ös   zPosixGroupsTester.tearDownrNztest needs posix.initgroups()cCsDt|jp dgƒd}t t ¡¡j}t ||¡| |t  ¡¡dSr]) ÚmaxrrSrTrr0rUrNrr,)rr‡r6r r r r[Ýs z!PosixGroupsTester.test_initgroupsrztest needs posix.setgroups()cCs6dgttdƒƒfD]}t |¡| |t ¡¡qdS)Nré)r©rêrrZassertListEqualr,)rrr r r Útest_setgroupsçs z PosixGroupsTester.test_setgroupsN) rûrürýrr"rWrþrrr[r r r r r rËs  ÿ  ÿrc@s,eZdZejddddfZdZdd„Zdd „Zd d „Z d d „Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Ze eedƒd¡dd„ƒZd d!„Zd"d#„Ze eedƒd¡d$d%„ƒZd&d'„Zee ej d(¡d)¡d*d+„ƒƒZee ej d(¡d)¡d,d-„ƒƒZ d.d/„Z!d0d1„Z"d2d3„Z#d4d5„Z$d6d7„Z%dS)8Ú_PosixSpawnMixinú-Iú-SrnroNcGstjddg|¢RS)Nr r )rrrs©rÚargsr r r Ú python_argsôsz_PosixSpawnMixin.python_argscCsŽtj}| tj|¡d|›d}| d|¡}| |d|tj¡}tj|ddt |ƒ$}|  |  ¡t |ƒ¡Wdƒn1s€0YdS)Nú2if 1: import os with open(zO, "w") as pidfile: pidfile.write(str(os.getpid())) rnrrp) rrrûr rÚ spawn_funcrRrxryrr;r›r/)rZpidfileÚscriptrrzrKr r r Útest_returns_pidüs   z!_PosixSpawnMixin.test_returns_pidc Cs~d}z| ||gtj¡}Wn6ttfyP}z| |j|¡WYd}~n2d}~00t |d¡\}}| ||¡| |d¡dS)NÚno_such_executabler) rrRrxÚFileNotFoundErrorrr;ÚfilenameÚwaitpidÚassertNotEqual)rrrzÚexcZpid2Ústatusr r r Útest_no_such_executable sþ$ z(_PosixSpawnMixin.test_no_such_executablecCs–tj}| tj|¡d|›d}| d|¡}| |d|itj¥ddi¥¡}tj|ddt |ƒ }|  |  ¡d¡Wdƒn1sˆ0YdS)NrzL, "w") as envfile: envfile.write(os.environ['foo']) rnrrOZbarrp) rrrûr rrrRrxryrr;r›)rZenvfilerrrzrKr r r Útest_specify_environments   ÿ z)_PosixSpawnMixin.test_specify_environmentcCs.|j|jd|jtjdd}tj|dddS©Nr©Ú file_actionsrp©rÚ NOOP_PROGRAMrRrxrry©rrzr r r Útest_none_file_actions(süz'_PosixSpawnMixin.test_none_file_actionscCs.|j|jd|jtjgd}tj|dddSrr!r#r r r Útest_empty_file_actions1süz(_PosixSpawnMixin.test_empty_file_actionscCs0|jtjtjddgtjdd}tj|dddS)NrnroF©Zresetidsrrp©rrrrsrRrxrryr#r r r Útest_resetids_explicit_default:s üz/_PosixSpawnMixin.test_resetids_explicit_defaultcCs0|jtjtjddgtjdd}tj|dddS)NrnroTr&rrpr'r#r r r Ú test_resetidsCs üz_PosixSpawnMixin.test_resetidscCsL| t¡.|jtjtjddgtjddWdƒn1s>0YdS)Nrnror&©r4r5rrrrsrRrxr_r r r Útest_resetids_wrong_typeLs   þz)_PosixSpawnMixin.test_resetids_wrong_typecCs4|jtjtjddgtjt ¡d}tj|dddS)Nrnro©Z setpgrouprrp)rrrrsrRrxr.rryr#r r r Útest_setpgroupRs üz_PosixSpawnMixin.test_setpgroupcCsL| t¡.|jtjtjddgtjddWdƒn1s>0YdS)NrnroZ023r,r*r_r r r Útest_setpgroup_wrong_type[s   þz*_PosixSpawnMixin.test_setpgroup_wrong_typeÚpthread_sigmaskzneed signal.pthread_sigmask()cCs>t d¡}|jtjtjd|gtjtjgd}t j |dddS)NúI import signal signal.raise_signal(signal.SIGUSR1)rn©Z setsigmaskrrp) ÚtextwrapÚdedentrrrrsrRrxrÚSIGUSR1rry)rr‹rzr r r Útest_setsigmaskas  üz _PosixSpawnMixin.test_setsigmaskcCsê| t¡.|jtjtjddgtjddWdƒn1s>0Y| t¡0|jtjtjddgtjdgdWdƒn1sˆ0Y| t¡:|jtjtjddgtjtj tj dgdWdƒn1sÜ0YdS)Nrnroé"r1Újr2© r4r5rrrrsrRrxrÞrÚNSIGr_r r r Útest_setsigmask_wrong_typeps"  þ$  þ$  ÿþz+_PosixSpawnMixin.test_setsigmask_wrong_typec Cst ¡\}}| tj|¡z¶t |d¡t d|›d¡}z"|jtj tj d|gtj dd}Wnft y}z|  d|›¡WYd}~n0Y| t¡0|jtjtjddgtjdgdWdƒn1sˆ0Y| t¡:|jtjtjddgtjtj tj dgdWdƒn1sÜ0YdS)Nrnror6r@r7r2r8r_r r r Útest_setsigdef_wrong_type±s  þ$  þ$  þz*_PosixSpawnMixin.test_setsigdef_wrong_typerÎzbpo-34685: test can fail on BSDcCsft d¡}t |¡}t d|›d|›d¡}|jtjtjd|gtjdt  |¡fd}t j |dddS©NrzF import os, sys if os.sched_getscheduler(0) != zV: sys.exit(101) if os.sched_getparam(0).sched_priority != z: sys.exit(102)rn)Z schedulerrp© rRrrÉr2r3rrrrsrxrÕrry©rZpolicyÚpriorityr‹rzr r r Útest_setscheduler_only_param¿s  þü   üz-_PosixSpawnMixin.test_setscheduler_only_paramcCsft d¡}t |¡}t d|›d|›d¡}|jtjtjd|gtj|t  |¡fd}t j |dddSrErFrGr r r Útest_setscheduler_with_policyÓs  þü   üz._PosixSpawnMixin.test_setscheduler_with_policycCs\tjdtj t¡tjdftjdftjddfg}|j|j d|j tj |d}t j |dddS)Nr:rr2rrrp) rRÚPOSIX_SPAWN_OPENrvÚrealpathÚ__file__rtÚPOSIX_SPAWN_CLOSEÚPOSIX_SPAWN_DUP2rr"rxrry)rr rzr r r Útest_multiple_file_actionsçs ý ýz+_PosixSpawnMixin.test_multiple_file_actionsc CsX|j}| t¡*|j|d|tjdgdWdƒn1s@0Y| t¡*|j|d|tjdgdWdƒn1s„0Y| t¡*|j|d|tjdgdWdƒn1sÈ0Y| t¡*|j|d|tjdgdWdƒn1s0Y| t¡.|j|d|tjtjfgdWdƒn1sX0Y| t¡2|j|d|tjtjddfgdWdƒn1s¦0Y| t¡0|j|d|tjtjdfgdWdƒn1sò0Y| t¡<|j|d|tjtjdt d tj dfgdWdƒn1sJ0YdS) Nrrr r)i90r2r…r:rò) r"r4r5rrRrxrNrÞrKrMrtrr r r Útest_bad_file_actionsósH ÿ$ ÿ$ ÿ$ ÿ& ÿ&  ÿ&  ÿ& þÿz&_PosixSpawnMixin.test_bad_file_actionscCs®tj}| tj|¡d}tjd|tjtjBtjBt j t j Bfg}|  d|¡}|j |d|tj|d}tj|ddt|ƒ }| | ¡d¡Wdƒn1s 0YdS)NúOif 1: import sys sys.stdout.write("hello") r2rnrrrpÚhello)rrrûr rRrKrr‘ÚO_TRUNCrrrrrrxryrr;r›)rrœrr rrzrKr r r Útest_open_files þÿ ÿ z_PosixSpawnMixin.test_open_filecCsœtj}| tj|¡d|›d}| d|¡}|j|d|tjtjdfgd}tj |ddt |ƒ&}|  |  ¡dt j¡Wdƒn1sŽ0YdS)Nz„if 1: import os try: os.fstat(0) except OSError as e: with open(z_, 'w') as closefile: closefile.write('is closed %d' % e.errno) rnrrrpz is closed %d)rrrûr rrrRrxrNryrr;r›r rÐ)rZ closefilerrrzrKr r r Útest_close_file$s   ÿ z _PosixSpawnMixin.test_close_filecCsÂtj}| tj|¡d}t|dƒT}tj| ¡dfg}| d|¡}|j |d|tj |d}tj |ddWdƒn1s|0Yt|ƒ }|  |  ¡d¡Wdƒn1s´0YdS) NrRrór2rnrrrprS)rrrûr rrRrOrbrrrxryr;r›)rZdupfilerZ childfiler rrzrKr r r r÷7s ÿ ÿ, z_PosixSpawnMixin.test_dup2)&rûrürýrrrsr"rrrrrr$r%r(r)r+r-r.rWrþrrr5r:r?rCrDrZskipIfrÌrÍrIrJrPrQrUrVr÷r r r r r ïsN      ÿ  ÿ ÿ ÿ  r Ú posix_spawnztest needs os.posix_spawnc@seZdZeeddƒZdS)ÚTestPosixSpawnrWN)rûrürýr3rrr r r r rXJsrXÚ posix_spawnpztest needs os.posix_spawnpc@s&eZdZeeddƒZejdd„ƒZdS)ÚTestPosixSpawnPrYNcCs t ¡}| tj|¡d}tj ||¡}t t j |¡ztj  |tj df¡}Wnt yf|}Yn0|ddddf}t d|f¡}d|f}t|d|iŽdS)Nzposix_spawnp_test_program.exeÚPATHr r rnrozË import os from test import support args = %a pid = os.posix_spawnp(args[0], args, os.environ) support.wait_process(pid, exitcode=0) )ÚtempfileÚmkdtemprûrrrRrvÚjoinr9rrrsÚpathseprxrVr2r3r)rÚtemp_dirZprogramZprogram_fullpathrvZ spawn_argsr‹rr r r Útest_posix_spawnpSs  ø z!TestPosixSpawnP.test_posix_spawnp) rûrürýr3rrrZskip_unless_symlinkrar r r r rZOs rZr‰ztest weak linking on macOSc@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!S)"ÚTestPosixWeaklinkingcsRddl}ddl}| ¡‰‡fdd„ˆDƒ|_tdd„| ¡d d¡Dƒƒ|_dS)Nrcs"h|]}| d¡rˆ|r|’qS)ZHAVE_rÍ)r¢Znm©Z config_varsr r Ú €r„z-TestPosixWeaklinking.setUp..css|]}t|ƒVqdSrr†)r¢Úpartr r r rˆr„z-TestPosixWeaklinking.setUp..rH)rrÌZget_config_varsÚ availablerŽÚmac_verrw)rrrÌr rcr r{s zTestPosixWeaklinking.setUpcCs||jvrt |›d¡‚dS)Nz not weak-linked)rfrWrXrr r r Ú_verify_availableƒs z&TestPosixWeaklinking._verify_availablecCsb| d¡|jdkr:| ttdƒd¡| ttdƒd¡n$| ttdƒd¡| ttdƒd¡dS) NZ HAVE_PWRITEV)r§r r¿zos.pwritev is not availablerzos.readv is not availablezos.pwritev is availablezos.readv is available)rhrgr]rrRrür_r r r rćs   z!TestPosixWeaklinking.test_pwritevcCsp| d¡|jdkr$| dtj¡nH| dtj¡| td¡tj dddWdƒn1sb0YdS)NZ HAVE_FSTATAT©r§r§údir_fd unavailableÚfilerr”) rhrgrrÚ_have_functionsÚ assertNotInr r­rRrr_r r r r‘s   zTestPosixWeaklinking.test_statcCsð| d¡|jdkr$| dtj¡nÈ| dtj¡| td¡"tj dtj ddWdƒn1sf0Y| td¡"tj dtj dd Wdƒn1s¤0Y| td ¡"tj dtj d d Wdƒn1sâ0YdS) NZHAVE_FACCESSATrirjrkrr”zfollow_symlinks unavailableFrázeffective_ids unavailableT)Z effective_ids) rhrgrrrlrmr r­rRrMrNr_r r r rOœs  00z TestPosixWeaklinking.test_accesscCs€| d¡|jdkr$| dtj¡nX| dtj¡| dtj¡| td¡ tj ddddWdƒn1sr0YdS) NZ HAVE_FCHMODATriZ HAVE_LCHMODrjrki¤rr”) rhrgrrrlrmr r­rRr–r_r r r Ú test_chmod­s  zTestPosixWeaklinking.test_chmodcCs‚| d¡|jdkr$| dtj¡nZ| dtj¡| dtj¡| td¡"tj dddddWdƒn1st0YdS)NZ HAVE_FCHOWNATriZ HAVE_LCHOWNrjrkrr”) rhrgrrrlrmr r­rRr2r_r r r r4¹s  zTestPosixWeaklinking.test_chownc Csü| d¡|jdkr&| dtj¡nÒ| dtj¡| td¡ tj ddddWdƒn1sf0Y| td¡ tj dddd Wdƒn1s¢0Y| td¡"tj ddddd Wdƒn1sà0Yt   ¡ô}tj   |d ¡}tj   |d¡}tj   |d¡}t|d ƒ}| d ¡Wdƒn1sJ0Yt d|¡| t¡ tj ||ddWdƒn1s’0Y| t¡ tj ||ddWdƒn1sÎ0YWdƒn1sî0YdS)NZ HAVE_LINKATrizsrc_dir_fd unavailableÚsourceÚtargetr©r¥zdst_dir_fd unavailable©r¦r¤r£rjÚdataTráF)rhrgrrrlrmr r­rRr£rr`rvr^rrfr9r4ÚFileExistsError)rr€Z link_pathZ target_pathÚ source_pathrr r r Ú test_linkÅs*  ..0  *  0 zTestPosixWeaklinking.test_linkcCs¢| d¡|jdkr$| dtj¡nz| dtj¡| td¡t  d¡Wdƒn1s^0Y| td¡t  d¡Wdƒn1s”0YdS)NZHAVE_FDOPENDIRrizClistdir: path should be string, bytes, os.PathLike or None, not intrzCscandir: path should be string, bytes, os.PathLike or None, not int) rhrgrrrlrmr r5rRr=Úscandirr_r r r Útest_listdir_scandirìs  (z)TestPosixWeaklinking.test_listdir_scandircCsp| d¡|jdkr$| dtj¡nH| dtj¡| td¡tj dddWdƒn1sb0YdS)NZ HAVE_MKDIRATrirjr©rr”) rhrgrrrlrmr r­rRryr_r r r Ú test_mkdirús   zTestPosixWeaklinking.test_mkdircCs*| d¡|jdkr&| dtj¡n| dtj¡| td¡ tj ddddWdƒn1sf0Y| td¡ tj ddddWdƒn1s¢0Y| td¡ tj ddddWdƒn1sÞ0Y| td¡ tj ddddWdƒn1s0YdS) NZ HAVE_RENAMEATriz%src_dir_fd and dst_dir_fd unavailabler¯r°rrqrr) rhrgrrrlrmr r­rRrµrír_r r r Útest_rename_replaces  ...z(TestPosixWeaklinking.test_rename_replacecCsª| d¡|jdkr$| dtj¡n‚| dtj¡| td¡tj dddWdƒn1sb0Y| td¡tj dddWdƒn1sœ0YdS)NZ HAVE_UNLINKATrirjrvrr”) rhrgrrrlrmr r­rRr rzr_r r r Útest_unlink_rmdirs  ,z&TestPosixWeaklinking.test_unlink_rmdircCst| d¡|jdkr$| dtj¡nL| dtj¡| td¡"tj dtj ddWdƒn1sf0YdS)NZ HAVE_OPENATrirjrvrr”) rhrgrrrlrmr r­rRrrtr_r r r Ú test_open's   zTestPosixWeaklinking.test_opencCsp| d¡|jdkr$| dtj¡nH| dtj¡| td¡tj dddWdƒn1sb0YdS)NZHAVE_READLINKATrirjrvrr”) rhrgrrrlrmr r­rRr³r_r r r Ú test_readlink2s   z"TestPosixWeaklinking.test_readlinkcCsr| d¡|jdkr$| dtj¡nJ| dtj¡| td¡ tj ddddWdƒn1sd0YdS)NZHAVE_SYMLINKATrirjr¯r°rr”) rhrgrrrlrmr r­rRr9r_r r r Ú test_symlink=s   z!TestPosixWeaklinking.test_symlinkcCs–| d¡| d¡|jdkr<| dtj¡| dtj¡nV| dtj¡| dtj¡| td¡tj dddWdƒn1sˆ0YdS)NZ HAVE_FUTIMENSZHAVE_UTIMENSAT)r§rPrjrvrr”) rhrgrrrlrmr r­rRrÜr_r r r r`Hs   zTestPosixWeaklinking.test_utimeN)rûrürýrrhrÄrrOrnr4rvrxryrzr{r|r}r~r`r r r r rbts     '    rbcCs.zt ttttt¡Wt ¡n t ¡0dSr)rZ run_unittestrrrXrZrbÚ reap_childrenr r r r Ú test_mainWsûr€Ú__main__)'Ú__doc__rerZtest.support.script_helperrÚ import_modulerr rrrrÛrRrÌrSrr\rWrr2rvr^Ú gettempdirrr:rþÚmaxsizerrrZTestCaserrr rrXrZrbr€rûr r r r Úsb    ÿ ÿ -$]$c