a 5êdg—ã@s<ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZddlZddlZz ddlZWneyêdZYn0ddl m!Z!ddl"m#Z#m$Z$e#dZ%e#dZ&e#dZ'ej( )d¡Z*ej(dd …d kZ+zddl,Z,ddl-Z-d Z.Wneynd Z.Yn0z ddl/Z/Wney”dZ/Yn0d d„Z0dd„Z1d@dd„Z2dd„Z3dAdd„Z4dd„Z5dd„Z6e6ƒZ7dd„Z8Gdd„dƒZ9Gdd „d e9ej:ƒZ;Gd!d"„d"e9ej:ƒZGd'd(„d(e9ej:ƒZ?Gd)d*„d*e9ej:ƒZ@Gd+d,„d,e@ƒZAGd-d.„d.e9ej:ƒZBGd/d0„d0ej:ƒZCGd1d2„d2ej:ƒZDGd3d4„d4eEƒZFe Ge7 d5¡Gd6d7„d7eFej:ƒƒZHe Ge* d8¡Gd9d:„d:eFej:ƒƒZIGd;d<„d„d>ej:ƒZKeLd?kr8e M¡dS)BéN) Ú make_archiveÚregister_archive_formatÚunregister_archive_formatÚget_archive_formatsÚErrorÚunpack_archiveÚregister_unpack_formatÚ RegistryErrorÚunregister_unpack_formatÚget_unpack_formatsÚ SameFileErrorÚ_GiveupOnFastCopy)Úsupport)ÚTESTFNÚFakePathÚ2Z_SRCZ_DSTÚdarwinéZaixTFcOstttddƒdƒ‚dS)NZEXDEVézInvalid cross-device link)ÚOSErrorÚgetattrÚerrno©ÚargsÚkwargs©rú,/usr/local/lib/python3.9/test/test_shutil.pyÚ _fake_rename4srcst ˆ¡‡fdd„ƒ}|S)Ncs0z"tj}tt_ˆ|i|¤ŽW|t_S|t_0dS©N)ÚosÚrenamer)rrZbuiltin_rename©ÚfuncrrÚwrap9sþzmock_rename..wrap)Ú functoolsÚwraps)r"r#rr!rÚ mock_rename8sr&cCsVt|tƒrtjj|Ž}t||r"dndƒ}| |¡Wdƒn1sH0YdS)zÐWrite *content* to a file located at *path*. If *path* is a tuple instead of a string, os.path.join will be used to make a path. If *binary* is true, the file will be opened in binary mode. ÚwbÚwN)Ú isinstanceÚtuplerÚpathÚjoinÚopenÚwrite)r+ZcontentÚbinaryÚfprrrÚ write_fileCs  r1cCsrdd„}t|dƒ}d dd„t|ƒDƒ¡}t|dƒ*}|||ƒD]}| |¡q@Wdƒn1sd0YdS) zBCreate a test file with an arbitrary size and random text content.css&||kr|V||8}q|r"|VdSrr)ÚtotalÚsteprrrÚchunksQs  zwrite_test_file..chunksi ócSsg|]}t tj¡ ¡‘qSr)ÚrandomÚchoiceÚstringÚ ascii_lettersÚencode)Ú.0ÚirrrÚ Zsÿz#write_test_file..r'N)Úminr,Úranger-r.)r+Úsizer4ÚbufsizeÚchunkÚfZcsizerrrÚwrite_test_fileOs  ÿ *rDcCsTt|tƒrtjj|Ž}t||r"dndƒ}| ¡WdƒS1sF0YdS)zÒReturn contents from a file located at *path*. If *path* is a tuple instead of a string, os.path.join will be used to make a path. If *binary* is true, the file will be opened in binary mode. ÚrbÚrN)r)r*rr+r,r-Úread)r+r/r0rrrÚ read_fileas  rHcCs|g}tt |¡ƒD]d}tj ||¡}tj |¡rltj |¡sl| |d¡t|ƒD]}| |d|¡qRq| |¡q|S)Nú/) ÚsortedrÚlistdirr+r,ÚisdirÚislinkÚappendÚrlistdir)r+ÚresÚnameÚpÚnrrrrOms  rOc CsâttdƒsdSd}d}zštjdt ¡dd }|j}| d¡Wdƒn1sT0Yt|dƒ }tjdt ¡ddÖ}|j}| ¡}| ¡}zt  ||dd¡WnTt yYWdƒWdƒW|durêt   |¡|durüt   |¡dS0WdƒWdƒW|dur0t   |¡|durDt   |¡d SWdƒn1s^0YWdƒn1s~0YW|duržt   |¡|durÞt   |¡n*|durÈt   |¡|durÜt   |¡0dS) NÚsendfileFr'©ÚdirÚdeletes 0123456789rEréT) ÚhasattrrÚtempfileÚNamedTemporaryFileÚgetcwdrQr.r-ÚfilenorTrrÚunlink)ÚsrcnameÚdstnamerCÚsrcÚdstÚinfdÚoutfdrrrÚsupports_file2file_sendfileysH (  ù    ûF    ý   recCsJtrBtjdkrBt dtj¡}| d¡d ¡d}t|dƒdkSdSdS) Niÿÿÿz/usr/bin/dump -o %sÚ éÿÿÿÿééi T)ÚAIXÚsysÚmaxsizeÚ subprocessÚ getoutputÚ executableÚsplitÚint)ZhdrsZmaxdatarrrÚ _maxdataOKœs rrc@seZdZddd„ZdS)ÚBaseTestNcCs$tj|t ¡d}| tj|¡|S)zjCreate a temporary directory that will be cleaned up. Returns the path of the directory. )ÚprefixrV)rZÚmkdtemprr\Ú addCleanuprÚrmtree)ÚselfrtÚdrrrru§szBaseTest.mkdtemp)N)Ú__name__Ú __module__Ú __qualname__rurrrrrs¥srsc@sâeZdZdd„Zejdd„ƒZejdd„ƒZe  e d¡dd „ƒZ e  e d¡d d „ƒZ d d „Z e ejdd…dkd¡e eedƒoŒe ¡dkd¡dd„ƒƒZdd„Zdd„Zdd„Zdd„Zejdd „ƒZe  e d¡d!d"„ƒZdS)#Ú TestRmTreecCsX| ¡}tj |d¡}t |¡ttj |d¡dƒt |¡}| |t¡t   |¡dS)NZkillmeZsomefileÚfoo) rurr+r,Úmkdirr1ÚfsencodeÚassertIsInstanceÚbytesÚshutilrw)rxÚtmpZvictimrrrÚtest_rmtree_works_on_bytes³s   z%TestRmTree.test_rmtree_works_on_bytescsä| ¡}tj |d¡}t |¡tj |d¡}t ||¡| ttj |¡|  tj  |¡¡|  tj  |¡¡g‰‡fdd„}tj ||d|  tˆƒd¡| ˆddtjj¡|  ˆdd|¡| ˆdddt¡dS) NrVÚlinkcsˆ |¡dSr©rN©r©ÚerrorsrrÚonerrorÇsz8TestRmTree.test_rmtree_fails_on_symlink..onerror©r‹rhrrX)rurr+r,rÚsymlinkÚ assertRaisesrrƒrwÚ assertTrueÚexistsÚlexistsÚ assertEqualÚlenÚassertIsrMr©rxr„Zdir_r†r‹rr‰rÚtest_rmtree_fails_on_symlink¼s   z'TestRmTree.test_rmtree_fails_on_symlinkc Csö| ¡}tj |d¡}tj |d¡}tj |d¡}|||fD]}t |¡q.onerrorrŒrhrrX)rurr+r,rÚ_winapiÚCreateJunctionrvrr^rŽrrƒrwrrr‘r’r“r”rMrr•rr‰rÚtest_rmtree_fails_on_junctionsås    z)TestRmTree.test_rmtree_fails_on_junctionsc Csö| ¡}tj |d¡}tj |d¡}tj |d¡}|||fD]}t |¡q.onerrorrŒrXrrh)rZÚmktemprurŽÚFileNotFoundErrorrƒrwr1rr+r,ÚNotADirectoryErrorÚassertInÚ exceptionÚfilenamerrr’r“r”ÚscandirrÚrmdir)rxr¯ÚtmpdirÚcmZ possible_argsr‹rr‰rÚtest_rmtree_errorss2 ( zTestRmTree.test_rmtree_errorsNéÚcygwinz2This test can't be run on Cygwin (issue #1071513).Úgeteuidrz9This test can't be run reliably as root (issue #1076467).cCs d|_t t¡| tjt¡tj td¡|_ tj td¡|_ t   |j ¡t |j ¡t  t¡j}t  |j ¡j}t  |j ¡j}t jt jB}t |j |¡t |j |¡t t|¡| tjt|¡| tj|j |¡| tj|j |¡tjt|jd| |jdd¡dS)NrÚaÚbrŒrz1Expected call to onerror function did not happen.)Ú errorStaterrrrvrƒrwr+r,Úchild_file_pathÚchild_dir_pathrÚcreate_empty_fileÚstatÚst_modeÚS_IREADÚS_IEXECÚchmodÚcheck_args_to_onerrorr’)rxZ old_dir_modeZold_child_file_modeZold_child_dir_modeZnew_moderrrÚ test_on_error3s*       ÿzTestRmTree.test_on_errorcCsº|jdkr‚|tjur$| ||j¡n:|tjur>| ||j¡n | |tj¡|  |t |jg¡|  t |dt ƒ¡|jd7_n4| |tj¡| |t ¡|  t |dt ƒ¡d|_dS)NrXrrhr)rºrr^r’r»r±r¼r”rKr­rrÚ issubclassr)rxr"ÚargÚexcrrrrÃRs    z TestRmTree.check_args_to_onerrorcsRzDtj‰‡fdd„}|t_t t¡ttdfdƒt t¡Wˆt_nˆt_0dS)Ncs|tkrtƒ‚nˆ|ƒSdSr)rr)Úfnrr©Z orig_lstatrrÚraiserpszFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat..raiserr~)rÚlstatrrr1rƒrw)rxrÊrrÉrÚ+test_rmtree_does_not_choke_on_failing_lstatms   z6TestRmTree.test_rmtree_does_not_choke_on_failing_lstatcsÜtjtjtjtjhtjko0tjtjvo0tjtjv}|r¾|  t j ¡|  t j j ¡| ¡}tj |d¡}t |¡zBt j}Gdd„dtƒ‰‡fdd„}|t _| ˆt j |¡W|t _qØ|t _0n| t j ¡| t j j ¡dS)Nr¸c@s eZdZdS)zHTestRmTree.test_rmtree_uses_safe_fd_version_if_available..CalledN)rzr{r|rrrrÚCalledŠr5rÍcsˆ‚dSrrr©rÍrrÚ_raiser‹szITestRmTree.test_rmtree_uses_safe_fd_version_if_available.._raiser)rr-r¾r^r±Úsupports_dir_fdrKÚ supports_fdÚsupports_follow_symlinksrrƒÚ_use_fd_functionsrwÚavoids_symlink_attacksrur+r,rÚ_rmtree_safe_fdÚ ExceptionrŽrŸ)rxrÓÚtmp_dirryZ real_rmtreerÏrrÎrÚ-test_rmtree_uses_safe_fd_version_if_available}s,ÿ þ ý    z8TestRmTree.test_rmtree_uses_safe_fd_version_if_availablecCs<tj| ¡d\}}t |¡| ttj|¡t  |¡dS©Nr¦) rZÚmkstemprurÚcloserŽr¬rƒrwÚremove)rxÚhandler+rrrÚtest_rmtree_dont_delete_file•s z'TestRmTree.test_rmtree_dont_delete_filec Cs‚t t¡zbtj td¡}tj td¡}t |¡t ||¡| ttj |¡tj |ddWtj tddntj tdd0dS)NÚcheeseÚshopTr§) rrrr+r,rrŽrrƒrw©rxrarbrrrÚtest_rmtree_on_symlinkœs   z!TestRmTree.test_rmtree_on_symlinkc Csšt t¡zztj td¡}tj td¡}t |¡ttj |d¡dƒ ¡t ||¡|  t t j |¡t j |ddWt j tddnt j tdd0dS)NrßràZspamr'Tr§) rrrr+r,r-rÛr¢r£rŽrrƒrwrárrrÚtest_rmtree_on_junctionªs   z"TestRmTree.test_rmtree_on_junction)rzr{r|r…rÚskip_unless_symlinkr–r¡ÚunittestÚ skipUnlessr¢r¤r¥r´ÚskipIfrkÚplatformrYrr·rÄrÃrÌrØrÞrârãrrrrr}±s2       $ÿÿ  r}c@s²eZdZdd„Zdd„Zejdd„ƒZdd„Zd d „Z d d „Z e j   d ¡dd„ƒZdd„Ze  eedƒd¡ejdd„ƒƒZdd„Zejdd„ƒZejdd„ƒZdd„Zdd„Zd S)!Ú TestCopyTreec Cs| ¡}tj | ¡d¡}| tj|¡| tjtj |¡¡t|dfdƒt  tj |d¡¡t|ddfdƒt  ||¡|  tj  tj |d¡¡¡|  tj  tj |d¡¡¡|  tj  tj |dd¡¡¡t|dfƒ}| |d¡t|ddfƒ}| |d¡dS)NÚ destinationútest.txtÚ123Útest_dirÚ456)rurr+r,rvrƒrwÚdirnamer1rÚcopytreerÚisfilerLrHr’©rxÚsrc_dirÚdst_dirÚactualrrrÚtest_copytree_simple»s" ÿ  z!TestCopyTree.test_copytree_simplec CsZ| ¡}| ¡}| tj|¡| tj|¡t|dfdƒt tj |d¡¡t tj |d¡¡t|ddfdƒt|ddfdƒtj ||dd|  tj  tj |d¡¡¡|  tj  tj |d¡¡¡|  tj  tj |dd¡¡¡t |dfƒ}| |d¡t |ddfƒ}| |d¡| t¡ tj ||d dWdƒn1sL0YdS) Nznonexisting.txtrìZ existing_dirz existing.txtzwill be replacedzhas been replacedT)Ú dirs_exist_okF)rurvrƒrwr1rrr+r,rðrrñrLrHr’rŽÚFileExistsErrorròrrrÚtest_copytree_dirs_exist_okÎs*ÿ    z(TestCopyTree.test_copytree_dirs_exist_okc Cs”| ¡}tj |d¡}tj |d¡}tj |d¡}t |¡t |¡t|dfdƒtj |d¡}tj |d¡}t tj |d¡|¡ttdƒr¤t |t j t j B¡ttd ƒrÆtt d ƒrÆt  |t j ¡t |¡}tj||d d | tj tj |dd¡¡¡t tj |dd¡¡}tjd kr8| d¡r8|dd…}| |tj |d¡¡t |¡} ttdƒrt| | j|j¡ttd ƒr| | j|j¡dS)NrarbÚsubzfile.txtr~r†zsub/linkÚlchmodÚlchflagsÚ UF_NODUMPT©ÚsymlinksÚntz\\?\é)rurr+r,rr1rrYrûr¾ÚS_IRWXUÚS_IRWXOrürýrËrƒrðrrMÚreadlinkrQÚ startswithr’r¿Úst_flags) rxr×rórôZsub_dirÚsrc_linkÚdst_linkÚsrc_statrõÚdst_statrrrÚtest_copytree_symlinksçs8  ÿ      z#TestCopyTree.test_copytree_symlinksc Cs^tjj}tjj}| ¡}z || ¡dƒ}t|dfdƒt|dfdƒt ||dƒ¡t|ddfdƒt ||dƒ¡t|ddfdƒt ||ddƒ¡t ||dd ƒ¡t|dddfdƒt|dd d fdƒzft d d¡}tj |||d |  |||dƒƒ¡|  |||dƒƒ¡|  |||dƒƒ¡Wt  |¡n t  |¡0zjt d d ¡}tj |||d |  |||dƒƒ¡|  |||dd ƒƒ¡|  |||ddƒƒ¡Wt  |¡n t  |¡0zTdd„}tj |||d |  |||dd d ƒƒ¡|  |||ddƒƒ¡Wt  |¡n t  |¡0Wt  |¡t  tj  |¡¡nt  |¡t  tj  |¡¡0dS)Nrêrërìztest.tmprírîZ test_dir2ÚsubdirZsubdir2ztest.pyz*.tmp©Úignorezsubdir*cSsfg}|D]X}tj ||¡}tj |¡rB| ¡ddkrB| |¡qtj |¡ddvr| |¡q|S)Nrgr z.py)rr+r,rLrprNÚsplitext)raÚnamesrPrQr+rrrÚ_filter/s ÿ  z8TestCopyTree.test_copytree_with_exclude.._filter)rr+r,rrur1rrƒÚignore_patternsrðrrŸrwrï)rxr,rrórôÚpatternsrrrrÚtest_copytree_with_excludesR   ÿ ÿ z'TestCopyTree.test_copytree_with_excludecsVtjj}tjj}ˆ ¡}||dƒ}t ||ƒ¡t ||dƒ¡t tj |dd¡¡t|dddfdƒg‰‡‡fdd„}|ˆ ¡dƒ}tj|||d ˆ  |||dddƒƒ¡|ˆ ¡dƒ}tjt   |¡||d ˆ  |||dddƒƒ¡|ˆ ¡dƒ}t t  |¡ƒd }ˆ |tj¡tj|||d ˆ  |||dddƒƒ¡ˆ tˆƒd ¡dS) NÚsourcerír rërîcsTˆ |¡ˆ |t¡ˆ |t¡ˆ t|ƒtt|ƒƒ¡|D]}ˆ |t¡q>gSr)rNrÚstrÚlistr’r“Úset)rarrQ©Z invokationsrxrrÚ_ignoreVs   z?TestCopyTree.test_copytree_arg_types_of_ignore.._ignorerêr ré )rr+r,rrurr1rƒrðrÚpathlibÚPathrr°rÚDirEntryr’r“)rxr,rr×rórrôZ src_dir_entryrrrÚ!test_copytree_arg_types_of_ignoreHs8  ÿÿÿz.TestCopyTree.test_copytree_arg_types_of_ignorec Csx| ¡}tj |d¡}t |¡tj |d¡}| tj|¡t |d¡t |dfdƒt tj |d¡d¡t |dfdƒt tj |d¡d¡t j|d }| t j|¡t |d¡t  ||¡|  t |¡jt |¡j¡|  t tj |d¡¡jt tj |d¡¡j¡|  t tj |d¡¡jt tj |d¡¡j¡tj |tj |¡d ¡}|  t |¡jt |¡j¡dS) Nrrêiÿzpermissive.txtrìzrestrictive.txtrîi€r¦rh)rurr+r,rrvrƒrwrÂr1rZrrðr’r¾r¿rp)rxr×rórôZrestrictive_subdirZrestrictive_subdir_dstrrrÚ!test_copytree_retains_permissionsrs6     ÿÿÿ ÿz.TestCopyTree.test_copytree_retains_permissionszos.chmodcCs„| ¡}tj | ¡d¡}| tj|¡| tjtj |¡¡tdƒ|_ |  tj ¡t  ||¡Wdƒn1sv0YdS)Nrêzka-boom) rurr+r,rvrƒrwrïÚPermissionErrorÚ side_effectrŽrrð)rxZ mock_patchrórôrrrÚtest_copytree_winerrors z#TestCopyTree.test_copytree_winerrorcsއ‡‡‡fdd„}g‰ˆ ¡‰tjˆ ¡d‰ttj ˆd¡dƒ}| ¡Wdƒn1s`0Ytj ˆˆ|dˆ  t ˆƒd¡dS)NcsRˆ d¡ˆ |t¡ˆ |t¡ˆ |tj ˆd¡¡ˆ |tj ˆd¡¡dS©Nr~)rNrrr’rr+r,)r¸r¹©rbÚflagrxrarrÚ custom_cpfuns    zETestCopyTree.test_copytree_custom_copy_function..custom_cpfunr¦r~r(©Ú copy_functionrh) rurZrªr-rr+r,rÛrƒrðr’r“)rxr'rCrr%rÚ"test_copytree_custom_copy_function›s&z/TestCopyTree.test_copytree_custom_copy_functionÚmkfifoúrequires os.mkfifo()c Cs2t t¡ztj td¡}t |¡tj |d¡}zt |¡Wn2tyt}z| d|¡WYd}~n d}~00zt  tt ¡Wn^tj yä}zD|j d}|  t|ƒd¡|d\}}}|  d||¡WYd}~nd}~00| d¡Wtjtdd tjt dd ntjtdd tjt dd 0dS) Nr Zmypipeúos.mkfifo(): %srrhz`%s` is a named pipez$shutil.Error should have been raisedTr§)rrrr+r,r+r!ÚskipTestrƒrðÚTESTFN2rrr’r“Úfailrw)rxr ÚpipeÚerŠrarbZ error_msgrrrÚtest_copytree_named_pipe­s*  $ & ÿz%TestCopyTree.test_copytree_named_pipecs€| ¡}tj | ¡d¡}t|dfdƒt tj |d¡¡t|ddfdƒg‰‡fdd„}tj|||d| t ˆƒd ¡dS) Nrêrërìrírîcsˆ ||f¡dSrr‡©rarb©ZcopiedrrÚ_copyÎsz6TestCopyTree.test_copytree_special_func.._copyr(rX) rurr+r,r1rrƒrðr’r“)rxrórôr6rr5rÚtest_copytree_special_funcÆs z'TestCopyTree.test_copytree_special_funccCsÒ| ¡}tj | ¡d¡}t dtj |d¡¡t tj |d¡¡t|ddfdƒ| tt j ||¡tj | ¡d¡}t j ||dd|  dt  |¡¡tj | ¡d ¡}t j ||dd |  dt  |¡¡dS) NrêZ IDONTEXISTrërírîÚ destination2T)Úignore_dangling_symlinksZ destination3rþ)rurr+r,rrr1rŽrrƒrðÚ assertNotInrKr­©rxrórôrrrÚtest_copytree_dangling_symlinksÔsz,TestCopyTree.test_copytree_dangling_symlinksc Cs.| ¡}tj | ¡d¡}t tj |d¡¡ttj |dd¡dƒWdƒn1sZ0Ytjtj |d¡tj |d¡ddtj||dd |  tj  tj |d¡¡¡|  dt  tj |d¡¡¡tj | ¡d ¡}tj||dd |  tj  tj |d¡¡¡|  dt  tj |d¡¡¡dS) NrêZreal_dirrër(Z link_to_dirT)Útarget_is_directoryFrþr8)rurr+r,rr-rrƒrðrŸrMr­rKrr;rrrÚtest_copytree_symlink_dirès  þz&TestCopyTree.test_copytree_symlink_dircCs\| ¡}|d}| tj|d¡tj |d¡}t|dƒt ||¡}|  dgt  |¡¡dS)NÚdestTr~) rurvrƒrwrr+r,r1rðr’rK)rxrórôraÚrvrrrÚtest_copytree_return_valueüs  z'TestCopyTree.test_copytree_return_valuecCs€| ¡}|jtj|ddtj |dd¡}tj |dd¡}t |¡tj |d¡}t|dƒt  ||¡}|  dgt  |¡¡dS)NTr§ÚtZpgZ somevendorz1.0Zpol) rurvrƒrwrr+r,Úmakedirsr1rðr’rK)rxÚbase_dirrórôrar@rrrÚtest_copytree_subdirectorys   z'TestCopyTree.test_copytree_subdirectoryN)rzr{r|rörùrrär rrr råÚmockÚpatchr#r*rærYrr3r7r<r>rArErrrrré¹s( A*      réc@s’eZdZejdd„ƒZe ee dƒd¡ejdd„ƒƒZ e  ee dƒd¡ejdd „ƒƒZ ejd d „ƒZ e ee d ƒo„eed ƒo„eedƒd¡dd„ƒZejdd„ƒZejeje ee dƒoÀe  ¡dkd¡dd„ƒƒƒZdd„Zdd„Zejdd„ƒZe ee dƒd ¡d!d"„ƒZejd#d$„ƒZejd%d&„ƒZd'd(„Zejd)d*„ƒZe ee d+ƒd,¡d-d.„ƒZejd/d0„ƒZe ee d1ƒd2¡d3d4„ƒZd5d6„Zd7d8„Z d9S):ÚTestCopycCs„| ¡}tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt|dƒt ||¡t ||¡t |tjtj B¡t |tj ¡|  t |¡j t |¡j ¡t  ||¡| t |¡j t |¡j ¡tjdkr€t |tj ¡t  ||¡| t |¡j t |¡j ¡t |tj ¡t  ||¡| t |¡j t |¡j ¡t |tj ¡t  ||¡| t |¡j t |¡j ¡dS)Nr~ÚbarÚbazÚquuxr)rurr+r,r1rrÂr¾rÚS_IRWXGrÚassertNotEqualr¿rƒÚcopymoder’rQ©rxr×rarbrrrrrÚtest_copymode_follow_symlinkss0         z&TestCopy.test_copymode_follow_symlinksrûzrequires os.lchmodcCsp| ¡}tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt|dƒt ||¡t ||¡t |tjtj B¡t |tj¡t  |tj tj B¡t  |tj ¡t j ||dd| t |¡jt |¡j¡| t |¡jt |¡j¡t  |tj ¡t j ||dd| t |¡jt |¡j¡t  |tj ¡t j ||dd| t |¡jt |¡j¡dS©Nr~rIrJrKF©Úfollow_symlinks)rurr+r,r1rrÂr¾rrLrûrrƒrNr’rËr¿rMrOrrrÚ test_copymode_symlink_to_symlink6s0     ÿz)TestCopy.test_copymode_symlink_to_symlinkz requires os.lchmod to be missingcCs€| ¡}tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt|dƒt ||¡t ||¡tj||dddSrQ)rurr+r,r1rrƒrNrOrrrÚ*test_copymode_symlink_to_symlink_wo_lchmodTs    z3TestCopy.test_copymode_symlink_to_symlink_wo_lchmodc Csî| ¡}tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt |¡}t ||j|jdf¡t|dƒ|  t |¡jt |¡j¡t  ||¡t  ||¡t tdƒrÂt  |tj ¡t tdƒrät tdƒrät |tj¡t |¡}t tdƒr tj||d d |  |jt |¡j¡tj||d d t |¡}tjtjvrpd D]"} | t|| ƒt|| ƒd ¡qLt tdƒrŒ| |j|j¡t tdƒr´t |dƒr´| |j|j¡tj||d d | tt |¡jt |¡jƒdk¡dS)Nr~rIrJÚquxgE@rûrürýTrRF©Úst_atimeÚst_mtimerhrgš™™™™™¹?)rurr+r,r1r¾ÚutimerXrYrMrrYrûrrürýrËrƒÚcopystatr¿rÒÚassertLessEqualrr’rrÚabs) rxr×rarbrrr Ú src_link_statZ dst_link_statÚattrrrrÚtest_copystat_symlinksdsJ   ÿ         ÿ ÿzTestCopy.test_copystat_symlinksÚchflagsÚ EOPNOTSUPPÚENOTSUPz)requires os.chflags, EOPNOTSUPP & ENOTSUPcCsª| ¡}tj |d¡}tj |d¡}t|dƒt|dƒdd„}tj}zVtjtjfD]}||ƒt_t   ||¡qT|tjtjƒt_|  t t j ||¡W|t_n|t_0dS)Nr›Úfile2Úxxxcstƒ‰ddœ‡‡fdd„ }|S)NTrRcsˆˆ_ˆ‚dSr)r)r+ÚflagsrS©ÚerrÚexrrÚ_chflags_raiser›szlTestCopy.test_copystat_handles_harmless_chflags_errors..make_chflags_raiser.._chflags_raiser©r)rhrjrrgrÚmake_chflags_raiser˜szSTestCopy.test_copystat_handles_harmless_chflags_errors..make_chflags_raiser) rurr+r,r1rarrbrcrƒr[rŽr)rxr²r›rdrlZ old_chflagsrhrrrÚ-test_copystat_handles_harmless_chflags_errorss   z6TestCopy.test_copystat_handles_harmless_chflags_errorscs | ¡}tj |d¡‰tˆdƒtj |d¡}t|dƒt ˆ|¡t ˆdd¡t ˆdd¡t ˆ|¡| t t  ˆ¡ƒt t  |¡ƒ¡| t  ˆd¡t  |d¡¡t  |¡t|dƒt tjdƒ‰‡‡fdd „}z4tj‰|t_t ˆ|¡| dt  |¡¡Wˆt_nˆt_0d d œ‡‡fd d „ }z"tj ‰|t_ t ˆ|¡Wˆt_ nˆt_ 0tj |d¡‰tj |d¡}tˆˆƒt||ƒt ˆdd¡t |dd¡t |d¡tj |d¡}tj |d¡}t||ƒt||ƒt ˆ|¡t ||¡| t  |d¡d¡| t  |d¡d¡dS)Nr~rIúuser.fooó42zuser.baró43ÚEPERMcs&|dkrˆ‚nˆ|||fi|¤ŽdS)Nrnr)Úfnamer_Úvalr)Ú orig_setxattrÚos_errorrrÚ_raise_on_user_fooÃsz3TestCopy.test_copyxattr.._raise_on_user_fooTrRcs |ˆkrttjdƒ‚ˆ||dS)NzOperation not supportedrR)rrrc)rrrS)Úorig_listxattrrarrÚ _raise_on_srcÐs z.TestCopy.test_copyxattr.._raise_on_srcZ the_originalZthe_original_rozuser.the_valuesfiddlyi$Zthe_copyZ the_copy_ro)rurr+r,r1rƒÚ _copyxattrÚsetxattrr’rJÚ listxattrÚgetxattrrÜrrrqr­rÂr[)rxr×rbrvrxZsrcroZdstror)rwrtrurarÚtest_copyxattr¬sZ       þ           zTestCopy.test_copyxattrr·rúroot privileges requiredcCsî| ¡}tj |d¡}tj |d¡}t|dƒt ||¡t |dd¡tj|ddddtj |d¡}tj |d ¡}t|dƒt ||¡tj||dd|  tj |dddd¡|  t tj |d¡tj||dd|  t  |d¡d¡dS) Nr~rJz trusted.foororpFrRrIrV) rurr+r,r1rrzrƒryr’r|rŽr)rxr×rarrbrrrrÚtest_copyxattr_symlinksìs     z TestCopy.test_copyxattr_symlinkscCsPd}| ¡}t||fdƒtj ||¡}| ¡}|||ƒtj ||¡}||fS)Nrëre)rur1rr+r,)rxÚmethodrrr²r›Útmpdir2rdrrrÚ _copy_files zTestCopy._copy_filecCsB| tj¡\}}| tj |¡¡| t |¡j t |¡j ¡dSr) r‚rƒÚcopyrrr+rr’r¾r¿)rxr›rdrrrÚ test_copyszTestCopy.test_copycCs | ¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt ||¡ttdƒrft |tj tj B¡t j ||dd|  tj |¡¡| t|ƒt|ƒ¡t |¡t j ||dd| tj |¡¡| t |¡t |¡¡ttdƒr| t |¡jt |¡j¡dS)Nr~rIrJrûTrRF)rurr+r,r1rrYrûr¾rrrƒrƒrŸrMr’rHrÜrrrËr¿)rxr×rarbrrrrÚtest_copy_symlinkss&      ÿzTestCopy.test_copy_symlinksrZzrequires os.utimecCsœ| tj¡\}}| tj |¡¡t |¡}t |¡}| |j |j ¡dD] }|  t ||ƒt ||ƒd¡qJt tdƒr˜t |dƒr˜| t |dƒt |dƒ¡dS)NrWrhrar) r‚rƒÚcopy2rrr+rr¾r’r¿r\rrY)rxr›rdZ file1_statZ file2_statr_rrrÚ test_copy20s    ÿ ÿzTestCopy.test_copy2c Cs®| ¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt ||¡ttdƒrft |tj tj B¡ttdƒrˆttdƒrˆt  |tj ¡t |¡}t  |¡}tj||dd| tj |¡¡| t|ƒt|ƒ¡t |¡tj||d d| tj |¡¡| t |¡t |¡¡t  |¡}tjtjvrVd D]"}| t||ƒt||ƒd ¡q2ttdƒr‚| |j|j¡| |j|j¡ttdƒrªt|d ƒrª| |j|j¡dS) Nr~rIrJrûrürýTrRFrWrhr)rurr+r,r1rrYrûr¾rrrürýrËrƒr†rŸrMr’rHrÜrrrZrÒr\rr¿rMr) rxr×rarbrr r^r r_rrrÚtest_copy2_symlinksAs<         ÿ zTestCopy.test_copy2_symlinkscCsr| ¡}tj |d¡}tj |d¡}t|dƒt |dd¡t ||¡| t  |d¡t  |d¡¡t  |¡dS)Nr~rIrnro) rurr+r,r1rzrƒr†r’r|rÜ)rxr×rarbrrrÚtest_copy2_xattrds    þzTestCopy.test_copy2_xattrcCsˆtjtjfD]v}| ¡}| ¡}tj |d¡}t|dƒ|||ƒ}| |tj |d¡¡||tj |d¡ƒ}| |tj |d¡¡q dS)Nr~rI) rƒrƒr†rurr+r,r1r’)rxrÈrórôrar@rrrÚtest_copy_return_valueqs  zTestCopy.test_copy_return_valuecCs²| ¡}tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt ||¡tj||dd| tj  |¡¡|  t  |¡t  |¡¡t ||¡|  tj  |¡¡dS)Nrarbrr†r~FrR) rurr+r,r1rrƒÚcopyfilerrMr’rrŸ)rxr×rarbrr†rrrÚtest_copyfile_symlinkss   zTestCopy.test_copyfile_symlinksr†zrequires os.linkc Cst t¡tj td¡}tj td¡}zât|dƒ}| d¡Wdƒn1sR0Yzt ||¡Wn2tyž}z|  d|¡WYd}~n d}~00|  t j t j ||¡t|dƒ }| | ¡d¡Wdƒn1sä0Yt |¡Wt jtddnt jtdd0dS) Nrßràr(Úcheddarz os.link(): %srFTr§)rrrr+r,r-r.r†r!r.rŽrƒr r‹r’rGrÜrw)rxrarbrCr2rrrÚ'test_dont_copy_file_onto_link_to_itselfs  ($ . z0TestCopy.test_dont_copy_file_onto_link_to_itselfc Csæt t¡tj td¡}tj td¡}zªt|dƒ}| d¡Wdƒn1sR0Yt d|¡| t j t j ||¡t|dƒ }|  |  ¡d¡Wdƒn1s¬0Yt |¡Wt jtddnt jtdd0dS)Nrßràr(rrFTr§)rrrr+r,r-r.rrŽrƒr r‹r’rGrÜrw)rxrarbrCrrrÚ*test_dont_copy_file_onto_symlink_to_itself¤s  (  . z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr+r,c CsŠzt t¡Wn2ty@}z| d|¡WYd}~n d}~00z6| tjtjtt ¡| tjtjt t¡Wt  t¡n t  t¡0dS)Nr-) rr+rr!r.rŽrƒÚSpecialFileErrorr‹r/Ú__file__rÜ)rxr2rrrÚtest_copyfile_named_pipe¹s$ÿÿz!TestCopy.test_copyfile_named_pipecCsl| ¡}| ¡}tj |d¡}tj |d¡}t|dƒt ||¡}| tj |¡¡|  t |ƒt |ƒ¡dS)NrIr~) rurr+r,r1rƒr‹rrr’rH)rxrórôÚdst_fileÚsrc_filer@rrrÚtest_copyfile_return_valueÇs  z#TestCopy.test_copyfile_return_valuecCsX| ¡}tj |d¡}t|dƒ| ttj||¡| t tj||¡|  t |ƒd¡dSr$) rurr+r,r1rŽr rƒr‹rr’rH)rxrór”rrrÚtest_copyfile_same_fileÒs  z TestCopy.test_copyfile_same_fileN)!rzr{r|rrärPrårærYrrTrçrUr`rrmZskip_unless_xattrr}r·rr‚r„r…r‡rˆr‰rŠrŒrŽrr’r•r–rrrrrHs\    (ÿý  ?ÿ    "      rHc@sveZdZe ¡dd„ƒZdd„Zd7dd„Ze ¡e  e   d¡d ¡d d „ƒƒZ e ¡d d „ƒZ e ¡e  e   d¡d¡dd„ƒƒZe ¡e  e   d¡d¡dd„ƒƒZdd„Ze ¡dd„ƒZe ¡e  ed¡dd„ƒƒZdd„Zdd „Ze ¡d!d"„ƒZd#d$„Zd%d&„Zd'd(„Zd)d*„Ze ¡d+d,„ƒZe ¡d-d.„ƒZe ¡e e oJe!ƒ d/¡d0d1„ƒƒZ"e ¡d2d3„ƒZ#d4d5„Z$d6S)8Ú TestArchivesc Csª| d¡\}}| ¡}t |¡tj |¡}tj tj |¡d¡}t  |¡*tj  |¡}t |d|dƒ}Wdƒn1s|0Y|  ||d¡|  tj |¡¡|  t |¡¡t |d¡$}| | ¡gd¢¡Wdƒn1sî0Yt  |¡t |d|dƒ}Wdƒn1s(0Y|  ||d ¡|  tj |¡¡|  t |¡¡t |d ¡$}| | ¡gd¢¡Wdƒn1sœ0YdS) Nr©ÚarchiveÚgztarÚ.ú.tar.gzzr:gz)ršz./subz./sub2z./file1z./file2z ./sub/file3Útarú.tarrF)Ú _create_filesrurr±r+rïr,ÚbasenamerÚ change_cwdÚabspathrr’rrñÚtarfileZ is_tarfiler-ÚassertCountEqualÚgetnames) rxÚroot_dirrDrÚwork_dirÚ rel_base_nameÚ base_nameÚtarballZtfrrrÚtest_make_tarballãs0    , ÿ" . ÿzTestArchives.test_make_tarballcCsFt |¡(}| ¡}| ¡t|ƒWdƒS1s80YdSr)r¢r-r¤Úsortr*)rxr+rœrrrrÚ_tarinfos zTestArchives._tarinfoÚdistcCs’| ¡}tj ||¡}tj|ddt|dfdƒt|dfdƒt tj |d¡¡t|ddfdƒt tj |d¡¡|rŠt|d fdƒ||fS) NT)Úexist_okr›rerdrúZfile3Zsub2Úouter)rurr+r,rCr1r)rxrDr¥r­rrrrž szTestArchives._create_filesrœzNeed the tar command to runcCs | ¡\}}tj | ¡d¡}t|d||ƒ}| ||d¡| tj |¡¡tj |d¡}ddd|g}t j ||t j d| tj |¡¡| |  |¡|  |¡¡t|d||ƒ}| ||d¡| tj |¡¡t|d||d d }| ||d¡| tj |¡¡dS) Nr˜r™r›z archive2.tarrœz-cf©ÚcwdÚstdoutrT)Údry_run) ržrr+r,rurr’rrñrmÚ check_callÚDEVNULLr¬)rxr¥rDr¨r©Ztarball2Ztar_cmdrrrÚtest_tarfile_vs_tars(  ÿ ÿz TestArchives.test_tarfile_vs_tarc Cs®| ¡\}}| ¡}t |¡tj |¡}tj tj |¡d¡}t  |¡(tj  |¡}t |d|ƒ}Wdƒn1sx0Y|  ||d¡|  tj |¡¡|  t |¡¡t |¡$}| | ¡gd¢¡Wdƒn1sè0Yt  |¡*tj  |¡}t |d||ƒ}Wdƒn1s.0Y|  ||d¡|  tj |¡¡|  t |¡¡t |¡$}| | ¡gd¢¡Wdƒn1s 0YdS)Nr˜Úzipú.zip)údist/ú dist/sub/ú dist/sub2/ú dist/file1ú dist/file2údist/sub/file3r¯)r¹rºr»r¼r½r¾)ržrurr±r+rïr,rŸrr r¡rr’rrñÚzipfileÚ is_zipfileÚZipFiler£Únamelist) rxr¥rDrr¦r§r¨rPÚzfrrrÚtest_make_zipfile<s2     *  ÿ"  .  ÿzTestArchives.test_make_zipfiler·zNeed the zip command to runc Cs | ¡\}}tj | ¡d¡}t|d||ƒ}| ||d¡| tj |¡¡tj |d¡}dddd|g}t j ||t j d| tj |¡¡t   |¡}| ¡}Wdƒn1s¶0Yt   |¡}| ¡} Wdƒn1sè0Y| t|ƒt| ƒ¡dS)Nr˜r·r¸z archive2.zipz-qz-rr°)ržrr+r,rurr’rrñrmr´rµr¿rÁrÂrJ) rxr¥rDr¨r˜Zarchive2Úzip_cmdrÃrZnames2rrrÚtest_zipfile_vs_zipas  ÿ & &z TestArchives.test_zipfile_vs_zipÚunzipzNeed the unzip command to runc Csø| ¡\}}tj | ¡d¡}t|d||ƒ}| ||d¡| tj |¡¡dd|g}t   |¡‚zt j |t j dWn\t jyÔ}zB|jjdd}d |vrª| d ¡d }| | ||¡¡WYd}~n d}~00Wdƒn1sê0YdS) Nr˜r·r¸rÇz-t)ÚstderrÚreplacer‰zunrecognized option: tzunzip doesn't support -tz{} **Unzip Output** {})ržrr+r,rurr’rrñrr rmÚ check_outputÚSTDOUTÚCalledProcessErrorÚoutputÚdecoder.r0Úformat) rxr¥rDr¨r˜rÅrÇZdetailsÚmsgrrrÚtest_unzip_zipfile{s    zTestArchives.test_unzip_zipfilecCs*| ¡}tj |d¡}| tt|d¡dS)Nr˜re)rurr+r,rŽÚ ValueErrorr)rxr²r¨rrrÚtest_make_archive“szTestArchives.test_make_archivecCsÞtr"t d¡d}t d¡d}nd}}| ¡\}}tj |  ¡d¡}t |d||||d}|  tj  |¡¡t |d||ƒ}|  tj  |¡¡t |d||||d}|  tj  |¡¡t |d||ddd}|  tj  |¡¡dS) NrÚrootr˜r·©ÚownerÚgrouprœZ kjhkjhkjgZoihohoh) ÚUID_GID_SUPPORTÚgrpÚgetgrgidÚpwdÚgetpwuidržrr+r,rurrrñ)rxr×rÖr¥rDr¨rPrrrÚtest_make_archive_owner_group˜s(  ÿ ÿ ÿz*TestArchives.test_make_archive_owner_groupúRequires grp and pwd supportc CsÚ| ¡\}}tj | ¡d¡}t d¡d}t d¡d}t   |¡$t |d|d||d}Wdƒn1sn0Y|  tj  |¡¡t |¡}z6| ¡D] }| |jd¡| |jd¡qžW| ¡n | ¡0dS)Nr˜rr™r­rÕ)ržrr+r,rurÙrÚrÛrÜrr rrrñr¢r-Z getmembersr’ÚuidÚgidrÛ) rxr¥rDr¨r×rÖÚ archive_namer˜ÚmemberrrrÚtest_tarfile_root_owner´s   ÿ$  z$TestArchives.test_tarfile_root_ownercCstt ¡}dd„}td|gdƒzFztdd| ¡dWntyHYn0| t ¡|¡Wtdƒn tdƒ0dS)Nc_s tƒ‚dSr)Ú RuntimeError)rÚkwrrrÚ_breaksÍsz3TestArchives.test_make_archive_cwd.._breaksreúxxx file)r¥)rr\rrrurÖr’r)rxZ current_dirrærrrÚtest_make_archive_cwdËs z"TestArchives.test_make_archive_cwdcCsZ| ¡}t |¡4| tddƒd¡| tj d¡¡Wdƒn1sL0YdS)NÚtestrœztest.tar© rurr r’rrrr+rñ©rxr¥rrrÚtest_make_tarfile_in_curdirÚs z(TestArchives.test_make_tarfile_in_curdircCsZ| ¡}t |¡4| tddƒd¡| tj d¡¡Wdƒn1sL0YdS)Nrér·ztest.ziprêrërrrÚtest_make_zipfile_in_curdirás z(TestArchives.test_make_zipfile_in_curdircCs˜| ttdd¡| ttddd„d¡| ttddd„ddg¡tddd„dgd ƒd d „tƒDƒ}| d|¡tdƒd d „tƒDƒ}| d|¡dS) NrerhcSstSr©ÚxrrrrÚìr5z;TestArchives.test_register_archive_format..cSstSrrîrrrrrðîr5)rhrX)rhrXrcSstSrrîrrrrrðñr5rçcSsg|] \}}|‘qSrr©r;rQÚparamsrrrr=òr5z=TestArchives.test_register_archive_format..cSsg|] \}}|‘qSrrrñrrrr=ör5)rŽÚ TypeErrorrrr­rr:)rxÚformatsrrrÚtest_register_archive_formatésÿÿ z)TestArchives.test_register_archive_formatcCs.| |dd„¡| |tj¡| |t¡dS)NcSs|Srr©r+rrrrðür5z3TestArchives.check_unpack_archive..)Ú#check_unpack_archive_with_converterrrr)rxrÏrrrÚcheck_unpack_archiveûsz!TestArchives.check_unpack_archivec CsÄ| ¡\}}t|ƒ}| d¡tj | ¡d¡}t||||ƒ}| ¡}t||ƒ||ƒƒ|  t|ƒ|¡| ¡} t||ƒ|| ƒ|d|  t| ƒ|¡|  t j t|t ƒ¡|j tt|t ƒdddS)Nr¯r˜)rÏre)ržrOrÜrr+r,rurrr’rŽrƒÚ ReadErrorrrÒ) rxrÏÚ converterr¥rDÚexpectedr¨r¯rZtmpdir3rrrr÷s  z0TestArchives.check_unpack_archive_with_convertercCs| d¡dS)Nrœ©rø©rxrrrÚtest_unpack_archive_tarsz$TestArchives.test_unpack_archive_tarcCs| d¡dS)Nr™rürýrrrÚtest_unpack_archive_gztarsz&TestArchives.test_unpack_archive_gztarcCs| d¡dS)NÚbztarrürýrrrÚtest_unpack_archive_bztarsz&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largercCs| d¡dS)NÚxztarrürýrrrÚtest_unpack_archive_xztar sz&TestArchives.test_unpack_archive_xztarcCs| d¡dS)Nr·rürýrrrÚtest_unpack_archive_zip%sz$TestArchives.test_unpack_archive_zipcs tƒ}‡fdd„}tdddg|dgƒtddƒˆ ttd dg|¡tdƒtd dg|ƒˆ d dgd ftƒ¡ˆ ddgd ftƒ¡td ƒˆ tƒ|¡dS) Ncs(ˆ |d¡ˆ |d¡ˆ |d¡dS)Nrhú stuff.booÚxx)r’)r¯Ú extract_dirÚextrarýrrÚ_boo-s  z/TestArchives.test_unpack_registry.._booZBooz.booz.b2)rrhrrZBoo2r©) r rrrŽr r r­r:r’)rxrôr rrýrÚtest_unpack_registry)s   ÿz!TestArchives.test_unpack_registryN)r­)%rzr{r|rZ requires_zlibrªr¬ržrårærƒÚwhichr¶rÄrÆrÑrÓrÝrØrãrèrìrírõrør÷rþrÿZ requires_bz2rZ requires_lzmarçrjrrrrr rrrrr—ßsZ #  ÿ  $ ÿ  ÿ         r—c@sLeZdZe eedƒd¡dd„ƒZe ed¡e ee dƒd¡dd „ƒƒZ d S) ÚTestMiscÚ disk_usagez)disk_usage not available on this platformcCs†t tj t¡¡}dD]}| t||ƒt¡q|  |j d¡|  |j d¡|  |j d¡|  |j |j ¡|  |j |j ¡t t¡dS)N)r2ÚusedÚfreer)rƒr rr+rïr‘rrrqZ assertGreaterr2rÚassertGreaterEqualr)rxÚusager_rrrÚtest_disk_usageFszTestMisc.test_disk_usagerÞÚchownzrequires os.chowncs‚ˆ ¡}tj|d‰tˆdƒˆ t¡t ˆ¡Wdƒn1sH0Yˆ t¡tjˆddWdƒn1s€0Yˆ t¡tjˆddWdƒn1s¸0Yˆ t ¡t ˆd¡Wdƒn1sî0Yˆ t ¡t ˆd¡Wdƒn1s&0Yt   ¡}t   ¡}d ‡‡fd d „ }t ˆ||¡|ˆ||ƒt ˆ|¡|ˆ|ƒtjˆ|d|ˆ|ƒtjˆ|d|ˆ|d t |||¡||||ƒt ||¡|||ƒtj||d|||ƒtj||d|||d z t  |¡d }t |¡d }WntyHYn60t ˆ||¡|ˆ||ƒt |||¡||||ƒdS)Nr¦ztesting chown functionznon-existing username)Úuserznon-existing groupname)r×óspamg…ëQ¸ @cs:t ˆ¡}|dur ˆ ||j¡|dur6ˆ ||j¡dSr)rr¾r’Úst_uidÚst_gid)r+rßràÚs©r¯rxrrÚ check_chownns  z(TestMisc.test_chown..check_chown)ràr)NN)rurZrªr1rŽrÒrƒrÚ LookupErrorrórÚgetuidÚgetgidrÛrÜrÙrÚÚKeyError)rxrïrßràrrr×rrrÚ test_chownUsR   ( , , * ,           zTestMisc.test_chownN) rzr{r|rårærYrƒrrØrrrrrrr Ds ÿ r c@sèeZdZdd„Zdd„Zdd„Zdd„Zd d „Ze  e e d ƒoHe   ¡d kd ¡dd„ƒZ dd„Zdd„Ze ejdkd¡dd„ƒZdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Ze ejdkd$¡d%d&„ƒZe ejdkd$¡d'd(„ƒZd)S)*Ú TestWhichcCst|jdd|_tj|jddd|_t |jjtj ¡|  |jj ¡tj   |jj¡\|_|_|j|_tj|_d|_dS)NZTmp)rtz.Exe©rVrtÚsuffixz.EXE)ruÚtemp_dirrZr[Ú temp_filerrÂrQr¾ÚS_IXUSRrvrÛr+rprVÚfileÚenv_pathÚcurdirÚextrýrrrÚsetUp–sþzTestWhich.setUpcCs&tj|j|jd}| ||jj¡dS©Nrö)rƒr r&rVr’r$rQ©rxr@rrrÚ test_basic¤szTestWhich.test_basiccCs(tj|jj|jd}| ||jj¡dSr+)rƒr r$rQr#r’r,rrrÚtest_absolute_cmd©szTestWhich.test_absolute_cmdcCs´tj |j¡\}}tj ||j¡}tj|d,tj ||j d}|  ||¡Wdƒn1s`0Ytj|jd(tj ||d}|  |¡Wdƒn1s¦0YdSr+) rr+rprVr,r&rr rƒr r#r’Ú assertIsNone)rxrDÚtail_dirÚrelpathr@rrrÚtest_relative_cmd¯s*zTestWhich.test_relative_cmdcCs€tj |j¡}tj|jdPtj|j|d}t j dkrT|  |tj  |j |j¡¡n | |¡Wdƒn1sr0YdS)NröÚwin32)rr+rïrVrr rƒr r&rkrèr’r,r(r/)rxrDr@rrrÚtest_cwd¼s  zTestWhich.test_cwdr·rznon-root user requiredcCsRt |jjtj¡t |jjtj¡r.| d¡t j |j |j tjd}|  |¡dS)Nzcan't set the file read-only)r+Úmode)rrÂr$rQr¾rÀÚaccessÚW_OKr.rƒr r&rVr/r,rrrÚtest_non_matching_modeÈs  z TestWhich.test_non_matching_modecCsjtj |j¡\}}tj|d8tj|j|d}|  |tj  ||j¡¡Wdƒn1s\0YdSr+) rr+rprVrr rƒr r&r’r,)rxrDr0r@rrrÚtest_relative_pathÒszTestWhich.test_relative_pathcCstjd|jd}| |¡dS)Nzfoo.exerö)rƒr rVr/r,rrrÚtest_nonexistent_fileØszTestWhich.test_nonexistent_filer3zpathext check is Windows-onlycCs<tj|jdd…|jd}| ||jjdd…|j¡dS)Néüÿÿÿrö)rƒr r&rVr’r$rQr)r,rrrÚtest_pathext_checkingÝszTestWhich.test_pathext_checkingcCsRt ¡6}|j|d<t |j¡}| ||jj¡Wdƒn1sD0YdS©NÚPATH) rÚEnvironmentVarGuardr'rƒr r&r’r$rQ©rxÚenvr@rrrÚtest_environ_pathås   zTestWhich.test_environ_pathc CsÚt ¡¾}d|d<tjjd|jdd‚t td|j¡Rt |j¡&t   |j ¡}|  |¡Wdƒn1sr0YWdƒn1s0YWdƒn1s®0YWdƒn1sÌ0YdS)Nr©r>ú os.confstrT©Ú return_valueÚcreateÚdefpath) rr?rårFrGrVÚ swap_attrrr rƒr r&r/r@rrrÚtest_environ_path_emptyës  ÿþ ý z!TestWhich.test_environ_path_emptyc Cs:tj |jj¡}tjdkrBtj}t|t ƒr4t  |¡}tj  ||¡}t   ¡Ú}tj|d<tjjd|jddšt  td|j¡jt |j¡}| |¡t  |j¡(t |j¡}| ||¡Wdƒn1sÎ0YWdƒn1sì0YWdƒn1s 0YWdƒn1s,0YdS)Nr3r>rCTrDrG)rr+rŸr$rQrkrèr(r)r‚r€r,rr?ÚpathseprårFrGrVrHrƒr r&r/r r’)rxZ expected_cwdr(rAr@rrrÚtest_environ_path_cwdös$      ÿþ   zTestWhich.test_environ_path_cwdc Cs8t ¡}| dd¡tjjdtddLt td|j ¡t   |j ¡}Wdƒn1s^0YWdƒn1s|0Y|  ||jj¡tjjd|j ddJt tdd¡t   |j ¡}Wdƒn1sÜ0YWdƒn1sú0Y|  ||jj¡Wdƒn1s*0YdS)Nr>rCT)r"rFrGrDr©)rr?ÚpoprårFrGrÒrHrrVrƒr r&r’r$rQr@rrrÚtest_environ_path_missing s    ÿþH ÿ þHz#TestWhich.test_environ_path_missingc CsŒtj |j¡}tj|jd\t ¡4}|j|d<tj |j dd}|  |¡Wdƒn1s`0YWdƒn1s~0YdS)Nrör>r©) rr+rïrVrr r?r'rƒr r&r/)rxrDrAr@rrrÚtest_empty_pathsÿ zTestWhich.test_empty_pathcCsNt ¡2}| dd¡t |j¡}| |¡Wdƒn1s@0YdSr=)rr?rLrƒr r&r/r@rrrÚtest_empty_path_no_PATH&s   z!TestWhich.test_empty_path_no_PATHztest specific to WindowscCs¢d}tj|jd|d}t |jtj¡| |j ¡tj   |j¡}tj   |¡d}t  ¡6}||d<tj||jd}| ||j¡Wdƒn1s”0YdS)Nú.xyzÚTmp2r!rÚPATHEXTrö)rZr[r#rrÂrQr¾r%rvrÛr+rŸrrr?rƒr r’©rxr)Z temp_filexyzZprogramrAr@rrrÚ test_pathext,sÿ  zTestWhich.test_pathextcCs˜d}tj|jd|d}| |j¡tj |j¡}tj  |¡d}t   ¡<}|›d|d<t j ||jd}| ||j¡Wdƒn1sŠ0YdS)NrPrQr!rú;rRrö)rZr[r#rvrÛrr+rŸrQrrr?rƒr r’rSrrrÚtest_pathext_with_empty_str>sÿ  z%TestWhich.test_pathext_with_empty_strN)rzr{r|r*r-r.r2r4rårçrYrr·r8r9r:rærkrèr<rBrIrKrMrNrOrTrVrrrrr ”s2  ÿ  ÿ   r c@seZdZdd„ZdS)ÚTestWhichBytescCsXt |¡t |j¡|_t |j¡|_t |jj¡|j_t |j¡|_t |j ¡|_ dSr) r r*rr€rVr&r$rQr(r)rýrrrr*Ps  zTestWhichBytes.setUpN)rzr{r|r*rrrrrWOsrWc@sˆeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z e dd„ƒZ e dd„ƒZ dd„Z e dd„ƒZdd„Ze dd„ƒZdd„Ze ejjd¡dd„ƒZd d!„Zd"d#„Zd$d%„Zd&d'„Zeje d(d)„ƒƒZeje d*d+„ƒƒZeje d,d-„ƒƒZ eje d.d/„ƒƒZ!d0d1„Z"d2d3„Z#e d4d5„ƒZ$e d6d7„ƒZ%d8d9„Z&e e'ed:ƒove (¡d;kove'ed<ƒove'e)d=ƒove'e)d>ƒd?¡d@dA„ƒZ*dBS)CÚTestMovecCsvd}| ¡|_| ¡|_tj |j|¡|_tj |j|¡|_t|jdƒ}|  d¡Wdƒn1sh0YdS)Nr~r'r) rurórôrr+r,r”r“r-r.)rxr¯rCrrrr*[s  zTestMove.setUpcCsŽt|dƒ}| ¡}Wdƒn1s(0Yt ||¡t|dƒ }| || ¡¡Wdƒn1sn0Y| tj |¡¡dS©NrE) r-rGrƒÚmover’rŸrr+r)rxrarbÚreal_dstrCÚcontentsrrrÚ_check_move_fileds  &  .zTestMove._check_move_filecCsFtt |¡ƒ}t ||¡| |tt |¡ƒ¡| tj |¡¡dSr) rJrrKrƒrZr’rŸr+r)rxrarbr[r\rrrÚ_check_move_dirls zTestMove._check_move_dircCs| |j|j|j¡dSr)r]r”r“rýrrrÚtest_move_filerszTestMove.test_move_filecCs| |j|j|j¡dSr)r]r”rôr“rýrrrÚtest_move_file_to_dirvszTestMove.test_move_file_to_dircCs"t |j¡}| ||j|j¡dSr)rrr”r]rôr“)rxrarrrÚ"test_move_file_to_dir_pathlike_srczs z+TestMove.test_move_file_to_dir_pathlike_srccCs"t |j¡}| |j||j¡dSr)rrrôr]r”r“©rxrbrrrÚ"test_move_file_to_dir_pathlike_dsts z+TestMove.test_move_file_to_dir_pathlike_dstcCs | ¡dSr)r_rýrrrÚtest_move_file_other_fs„sz TestMove.test_move_file_other_fscCs | ¡dSr)r`rýrrrÚtest_move_file_to_dir_other_fs‰sz'TestMove.test_move_file_to_dir_other_fsc Cs@tj| ¡d}z| |j||¡Wt |¡n t |¡0dSrÙ)rZrªrur^rórrw©rxrôrrrÚ test_move_dirŽszTestMove.test_move_dircCs | ¡dSr)rgrýrrrÚtest_move_dir_other_fs–szTestMove.test_move_dir_other_fsc Cs,| |j|jtj |jtj |j¡¡¡dSr)r^rórôrr+r,rŸrýrrrÚtest_move_dir_to_dir›s ÿzTestMove.test_move_dir_to_dircCs | ¡dSr)rirýrrrÚtest_move_dir_to_dir_other_fs sz&TestMove.test_move_dir_to_dir_other_fsc Cs4| |jtjj|jtj |jtj |j¡¡¡dSr)r^rórr+Úseprôr,rŸrýrrrÚtest_move_dir_sep_to_dir¥sÿz!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc Cs4| |jtjj|jtj |jtj |j¡¡¡dSr)r^rórr+Úaltseprôr,rŸrýrrrÚtest_move_dir_altsep_to_dir©sÿz$TestMove.test_move_dir_altsep_to_dircCsHt|jdƒWdƒn1s"0Y| tjtj|j|j¡dS)Nr')r-r“rŽrƒrrZr”rôrýrrrÚ"test_existing_file_inside_dest_dir®sz+TestMove.test_existing_file_inside_dest_dircCs*tj |jd¡}| tjtj|j|¡dS©NrI)rr+r,rórŽrƒrrZrbrrrÚtest_dont_move_dir_in_itself´sz%TestMove.test_dont_move_dir_in_itselfc Csrt t¡zVdD]B\}}tj t|¡}tj t|¡}|jt ||¡d||fdqWt  t¡n t  t¡0dS)N))Úsrcdirz srcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s)©rÐ) rrrr+r,rrƒÚ _destinsrcrrwrárrrÚtest_destinsrc_false_negative¹s  ÿÿ z&TestMove.test_destinsrc_false_negativec Csrt t¡zVdD]B\}}tj t|¡}tj t|¡}|jt ||¡d||fdqWt  t¡n t  t¡0dS)N))rrzsrc/dest)rrz srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s)rs) rrrr+r,rŸrƒrtrrwrárrrÚtest_destinsrc_false_positiveÅs  ÿÿ z&TestMove.test_destinsrc_false_positivecCs\tj |jd¡}t |j|¡t ||j¡|  tj  |j¡¡|  tj  |j|j¡¡dSrp) rr+r,rórr”rƒrZr“rrMÚsamefilerbrrrÚtest_move_file_symlinkÑs zTestMove.test_move_file_symlinkcCsld}tj |j|¡}t |j|¡t ||j¡tj |j|¡}|  tj  |¡¡|  tj  |j|¡¡dSrp) rr+r,rórr”rƒrZrôrrMrw)rxr¯rbZ final_linkrrrÚtest_move_file_symlink_to_dirÚsz&TestMove.test_move_file_symlink_to_dircCsztj |jd¡}tj |jd¡}t ||¡tj |jd¡}t ||¡| tj  |¡¡|  tj  |¡tj  |¡¡dS©NrJrIrK) rr+r,rórrôrƒrZrrMr’Úrealpath©rxrarbrrrrÚtest_move_dangling_symlinkås  z#TestMove.test_move_dangling_symlinkcCs|tj |jd¡}tj |jd¡}t |¡t ||¡tj |jd¡}t ||¡|  tj  |¡¡|  tj  ||¡¡dSrz) rr+r,rórrrôrƒrZrrMrwr|rrrÚtest_move_dir_symlinkðs   zTestMove.test_move_dir_symlinkc Cs6t |j|j¡}| |tj |jtj |j¡¡¡dSr) rƒrZr”rôr’rr+r,rŸr,rrrÚtest_move_return_valueüsÿzTestMove.test_move_return_valuecCs6t |jtj |jd¡¡}| |tj |jd¡¡dSrp)rƒrZr”rr+r,rôr’r,rrrÚ test_move_as_rename_return_valuesz)TestMove.test_move_as_rename_return_valuecs8g‰‡fdd„}tj|j|j|d| tˆƒd¡dS)Ncsˆ ||f¡dSrr‡r4©Zmovedrrr6sz7TestMove.test_move_file_special_function.._copyr(rh)rƒrZr”rôr’r“©rxr6rrrÚtest_move_file_special_functions z(TestMove.test_move_file_special_functioncsdg‰‡fdd„}t tj |jd¡¡t tj |jd¡¡tj|j|j|d|  t ˆƒd¡dS)Ncsˆ ||f¡dSrr‡r4rrrr6sz6TestMove.test_move_dir_special_function.._copyÚchildZchild1r(r) rr½rr+r,rórƒrZrôr’r“r‚rrrÚtest_move_dir_special_function s  z'TestMove.test_move_dir_special_functionc Cs~| ¡|_tj tj |j¡tj |j¡ ¡¡}| |j|¡z.t   |j|¡|  tj  |¡¡Wt  |¡n t  |¡0dSr)rurórr+r,rïrŸÚupperrMrƒrZrrLr±rfrrrÚtest_move_dir_caseinsensitives  þz&TestMove.test_move_dir_caseinsensitiver·rrüÚ SF_IMMUTABLEÚ UF_OPAQUEr~c Cs0zÜt t¡t ttj¡| ttj tt ¡|  t t  ¡v¡t ttj ¡t tj td¡¡t ttj¡| ttj tt ¡|  t t  ¡v¡Wtj t¡r¸t ttj ¡t t¡tj t ¡rÜt t tj ¡t t ¡nNtj t¡rt ttj ¡t t¡tj t ¡r*t t tj ¡t t ¡0dS)Nr„)rrÚ TESTFN_SRCrür¾rˆrŽr!rƒrZÚ TESTFN_DSTrŸrKr‰Z os_helperr½r+r,rrwrýrrrÚtest_move_dir_permission_denied(s,     û z(TestMove.test_move_dir_permission_deniedN)+rzr{r|r*r]r^r_r`rarcr&rdrergrhrirjrlrårærr+rmrnrorqrurvrrärxryr}r~rr€rƒr…r‡rYr·r¾rŒrrrrrXYsh              ÿþürXc@s`eZdZGdd„deƒZdd„Ze ed¡dd„ƒZ e ed¡dd „ƒZ e ed¡d d „ƒZ d S) Ú TestCopyFilec@s:eZdZdZdZdZd dd„Zdd„Zdd „Zd d „Z dS) zTestCopyFile.FauxFNTcCs||_||_dSr)Ú_raise_in_exitÚ_suppress_at_exit)rxZ raise_in_exitZsuppress_at_exitrrrÚ__init__QszTestCopyFile.Faux.__init__cGsdS)Nr©r)rxrrrrrGTszTestCopyFile.Faux.readcCs d|_dS)NT)Ú_enteredrýrrrÚ __enter__VszTestCopyFile.Faux.__enter__cCs&|||f|_|jr d|_tdƒ‚|jS)NTú Cannot close)Ú _exited_withrŽÚ_raisedrr)rxÚexc_typeÚexc_valÚexc_tbrrrÚ__exit__Xs  zTestCopyFile.Faux.__exit__)FT) rzr{r|r‘r”r•rrGr’r™rrrrÚFauxMs ršc Csrddd„}t td|¡F| t¡t dd¡Wdƒn1sF0YWdƒn1sd0YdS)NrFcSs|dkrtdƒ‚dS)NÚsrcfilezCannot open "srcfile"rk©r¯r5rrrÚ_open`sz4TestCopyFile.test_w_source_open_fails.._openr-r›Údestfile)rF)rrHrƒrŽrr‹©rxrrrrÚtest_w_source_open_fails_s  z%TestCopyFile.test_w_source_open_failszskipped on macOScsˆ| ¡‰d ‡fdd„ }t td|¡t dd¡Wdƒn1sF0Y| ˆj¡| ˆjdtu¡|  ˆjdj d ¡dS) NrFcs |dkr ˆS|dkrtdƒ‚dS)Nr›ržúCannot open "destfile"rkrœ©r›rrrms z2TestCopyFile.test_w_dest_open_fails.._openr-r›ržrrh)r¡)rF) ršrrHrƒr‹rr‘r”rr’rrŸrr¢rÚtest_w_dest_open_failsis* ÿz#TestCopyFile.test_w_dest_open_failscs¬| ¡‰| d¡‰d ‡‡fdd„ }t td|¡t dd¡Wdƒn1sR0Y| ˆj¡| ˆj¡| ˆj¡| ˆjdt u¡|  ˆjd j d ¡dS) NTrFcs|dkr ˆS|dkrˆSdS©Nr›ržrrœ©ržr›rrr€s z3TestCopyFile.test_w_dest_close_fails.._openr-r›ržrrh)r“)rF) ršrrHrƒr‹rr‘r•r”rr’rrŸrr¥rÚtest_w_dest_close_fails{s *   ÿz$TestCopyFile.test_w_dest_close_failsc sÎ| d¡‰| ¡‰d ‡‡fdd„ }t td|¡F| t¡t dd¡Wdƒn1s^0YWdƒn1s|0Y| ˆj¡| ˆj¡|  ˆj ¡| ˆj ddu¡| ˆj ¡dS) NTrFcs|dkr ˆS|dkrˆSdSr¤rrœr¥rrr–s z5TestCopyFile.test_w_source_close_fails.._openr-r›ržr)rF) ršrrHrƒrŽrr‹rr‘rŸr•r”rŸrr¥rÚtest_w_source_close_failss  H   z&TestCopyFile.test_w_source_close_failsN) rzr{r|Úobjectršr rårçÚMACOSr£r¦r§rrrrrKs     rc@sxeZdZdZedd„ƒZedd„ƒZdd„Zej dd „ƒZ d d „Z d d „Z dd„Z dd„Ze ejdkd¡dd„ƒZdS)ÚTestCopyFileObji cCstt|jƒdSr)rDrÚFILESIZE©ÚclsrrrÚ setUpClassªszTestCopyFileObj.setUpClasscCst t¡t t¡dSr)rr^rr/r¬rrrÚ tearDownClass®s zTestCopyFileObj.tearDownClasscCst t¡dSr©rr^r/rýrrrÚtearDown³szTestCopyFileObj.tearDownc csbttdƒD}ttdƒ}||fVWdƒn1s60YWdƒn1sT0YdS©NrEr'©r-rr/rárrrÚ get_files¶s  zTestCopyFileObj.get_filesc Cslt|dƒN}t|dƒ$}| | ¡| ¡¡Wdƒn1s@0YWdƒn1s^0YdSrY)r-r’rG)rxrarbÚfsrcÚfdstrrrÚassert_files_eq¼s  zTestCopyFileObj.assert_files_eqcCsH| ¡ \}}t ||¡Wdƒn1s.0Y| tt¡dSr)r´rƒÚ copyfileobjr·rr/rárrrÚ test_contentÁs*zTestCopyFileObj.test_contentcCs<| ¡ \}}t ||¡Wdƒn1s.0YdSr)r´rƒr¸rárrrÚtest_file_not_closedÆs z$TestCopyFileObj.test_file_not_closedcCs`| ¡D\}}t ||¡| | ¡|j¡| | ¡|j¡Wdƒn1sR0YdSr)r´rƒr¸r’Útellr«rárrrÚtest_file_offsetÌs z TestCopyFileObj.test_file_offsetrz Windows onlycCs~tj d¡}t tt¡Wdƒn1s.0Y| |jddd¡t j t   ¡dd}|  d¡Wdƒn1s€0Y|j}| tj|¡tj d¡}t |t¡Wdƒn1sÌ0Y| |jddd¡t j t   ¡dd}Wdƒn1s0Y|j}| tj|¡tj d¡}t |t¡Wdƒn1sd0Y| |t¡dS) Nzshutil._copyfileobj_readintorrXiFrUsfoor)rårFrGrƒr‹rr/r’Ú call_argsrZr[rr\r.rQrvrr^r·)rxÚmrCrrrrrÚ test_win_implÒs"*(* ,zTestCopyFileObj.test_win_implN)rzr{r|r«Ú classmethodr®r¯r±Ú contextlibÚcontextmanagerr´r·r¹rºr¼rårçrrQr¿rrrrrª§s   rªc@s’eZdZdZdZdZdZedd„ƒZedd„ƒZ d d „Z e j d d „ƒZ d d„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„ZdS) Ú_ZeroCopyFileTestz#Tests common to all zero-copy APIs.i r5r©cCsDtt|jƒttdƒ}| ¡|_Wdƒn1s60YdSrY)rDrr«r-rGÚFILEDATA)r­rCrrrr®÷s   z_ZeroCopyFileTest.setUpClasscCst t¡dSr)rr^rr¬rrrr¯þsz_ZeroCopyFileTest.tearDownClasscCst t¡dSrr°rýrrrr± sz_ZeroCopyFileTest.tearDownc csbttdƒD}ttdƒ}||fVWdƒn1s60YWdƒn1sT0YdSr²r³rárrrr´ s  z_ZeroCopyFileTest.get_filescOs tdƒ‚dS)Nzmust be implemented in subclass)ÚNotImplementedError)rxrrrrrÚ zerocopy_fun sz_ZeroCopyFileTest.zerocopy_funcCs$| ¡| ¡| ¡| ¡dSr)r±r¯r®r*rýrrrÚreset sz_ZeroCopyFileTest.resetc Cs¶| ¡ \}}| ||¡Wdƒn1s.0Y| ttdd|j¡| ¡L\}}tj d¡}t   t t¡Wdƒn1sŠ0YWdƒn1s¨0YdS)NT©r/zshutil.copyfileobj) r´rÆr’rHr/rÄrårFrGrƒr‹r)rxrarbr¾rrrÚtest_regular_copy s**z#_ZeroCopyFileTest.test_regular_copyc Csˆ| |j¡| ¡J\}}| t¡| ||¡Wdƒn1sF0YWdƒn1sd0Y| ttdd|j ¡dS)NTrÈ) rvrÇr´rŽrÖrÆr’rHrrÄrárrrÚtest_same_file s   Hz _ZeroCopyFileTest.test_same_filecCsZtjt ¡d}| t¡}t |d¡Wdƒn1s<0Y| |j j |¡dS)Nr¦Únew) rZrªrr\rŽr«rƒr‹r’r®r¯)rxrQr³rrrÚtest_non_existent_src( s *z'_ZeroCopyFileTest.test_non_existent_srcc sÖtd‰td‰| ‡fdd„¡| ‡fdd„¡tˆdƒWdƒn1sT0YtˆdƒF}tˆdƒ}| ||¡Wdƒn1s–0YWdƒn1s´0Y| tˆdd d ¡dS) Nrarbcs t ˆ¡Sr©rr^r)r_rrrð1 r5z3_ZeroCopyFileTest.test_empty_file..cs t ˆ¡SrrÍr)r`rrrð2 r5r'rETrÈr5)rrvr-rÆr’rHrár)r`r_rÚtest_empty_file. s   Hz!_ZeroCopyFileTest.test_empty_filecCsHtjj|jtd"| ttjtt ¡Wdƒn1s:0YdS)N©r") rårFrGÚ PATCHPOINTÚZeroDivisionErrorrŽrƒr‹rr/rýrrrÚtest_unhandled_exception< s  ÿÿz*_ZeroCopyFileTest.test_unhandled_exceptionc Cs tjj|jttjdƒdr| ¡J\}}| t ¡|  ||¡Wdƒn1sV0YWdƒn1st0YWdƒn1s’0YdS©NÚyorÏ) rårFrGrÐrrÚEINVALr´rŽr rÆrárrrÚtest_exception_on_first_callB s   ÿ z._ZeroCopyFileTest.test_exception_on_first_callc Cs|tjj|jttjdƒdN| ¡&\}}| t|j ||¡Wdƒn1sP0YWdƒn1sn0YdSrÓ) rårFrGrÐrrÚENOSPCr´rŽrÆrárrrÚtest_filesystem_fullL s   ÿz&_ZeroCopyFileTest.test_filesystem_fullN)rzr{r|Ú__doc__r«rÄrÐrÀr®r¯r±rÁrÂr´rÆrÇrÉrÊrÌrÎrÒrÖrØrrrrrÃñs(     rÃzos.sendfile() not supportedc@sXeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dS)ÚTestZeroCopySendfileú os.sendfilecCs t ||¡Sr)rƒÚ_fastcopy_sendfile)rxrµr¶rrrrÆY sz!TestZeroCopySendfile.zerocopy_func Cs²t |j¡|}ttdƒR}| t¡| ||¡Wdƒn1sF0Yt  ||¡Wdƒn1sp0YWdƒn1sŽ0Y|  t tdd|j¡dS)Nr'TrÈ) ÚioÚBytesIOrÄr-r/rŽr rÆrƒr¸r’rHrárrrÚtest_non_regular_file_src\ s   *Hz.TestZeroCopySendfile.test_non_regular_file_srcc Cs´ttdƒ–}t ¡n}| t¡| ||¡Wdƒn1sB0Yt ||¡|  d¡|  |  ¡|j ¡Wdƒn1sˆ0YWdƒn1s¦0YdS)NrEr) r-rrÝrÞrŽr rÆrƒr¸Úseekr’rGrÄrárrrÚtest_non_regular_file_dste s   *  z.TestZeroCopySendfile.test_non_regular_file_dstc s‡‡fdd„}g‰tj‰tjjdd|dr| ¡J\}}| t¡}t  ||¡Wdƒn1sf0YWdƒn1s„0YWdƒn1s¢0Y|  |j j t j ¡dS)Ncs,ˆsˆ d¡ˆ|i|¤ŽSttjdƒ‚dS)NrÔ)rNrrÚEBADFr©r&Z orig_sendfilerrrTo s zDTestZeroCopySendfile.test_exception_on_second_call..sendfilerÛT)rFr")rrTrårFrGr´rŽrrƒrÜr’r®rrâ)rxrTrarbr³rrãrÚtest_exception_on_second_calln s ÿ fz2TestZeroCopySendfile.test_exception_on_second_callc Cs‚tjjdtdH}| ¡ \}}t ||¡Wdƒn1s@0YWdƒn1s^0Y| tt dd|j ¡dS)Núos.fstatrÏTrÈ) rårFrGrr´rƒrÜr’rHr/rÄ©rxr¾rarbrrrÚtest_cant_get_size€ s  <z'TestZeroCopySendfile.test_cant_get_sizec Cs’tj ¡}d|_tjjd|dH}| ¡ \}}t ||¡Wdƒn1sP0YWdƒn1sn0Y| t t dd|j ¡dS)Nirå©rETrÈ) rårFÚMockÚst_sizerGr´rƒrÜr’rHr/rÄ©rxrFr¾rarbrrrÚtest_small_chunksŠ s  <z&TestZeroCopySendfile.test_small_chunksc Cs˜tj ¡}|jd|_tjjd|dH}| ¡ \}}t ||¡Wdƒn1sV0YWdƒn1st0Y|  t t dd|j ¡dS)Ni@rårèTrÈ) rårFrér«rêrGr´rƒrÜr’rHr/rÄrërrrÚtest_big_chunk— s   <z#TestZeroCopySendfile.test_big_chunkcCsÂtjjdtdž}| ttjtt¡|j dd}|  |t j   t¡¡t t¡ttddd| tjtd¡| ttjttd¡|j dd}|  |d ¡Wdƒn1s´0YdS) NrÛrÏrrshelloTrÈÚ3i€)rårFrGrÑrŽrƒr‹rr/r½r’rr+Úgetsizerr^r1rv)rxr¾Ú blocksizerrrÚtest_blocksize_arg¤ s"ÿÿ  ÿz'TestZeroCopySendfile.test_blocksize_argc Csîzàtjj|jttjdƒdr}| ¡J\}}| t ¡t   ||¡Wdƒn1sX0YWdƒn1sv0YWdƒn1s”0Ytj |j¡}t   t t¡Wdƒn1sÎ0YWdt _ndt _0dS)NrÔrÏT)rårFrGrÐrrÚENOTSOCKr´rŽr rƒrÜr‹rr/Ú_USE_CP_SENDFILErærrrÚtest_file2file_not_supported¶ s þ H  z1TestZeroCopySendfile.test_file2file_not_supportedN) rzr{r|rÐrÆrßrárärçrìrírñrôrrrrrÚU s     rÚz macOS onlyc@seZdZdZdd„ZdS)ÚTestZeroCopyMACOSzposix._fcopyfilecCst ||tj¡Sr)rƒÚ_fastcopy_fcopyfileÚposixÚ_COPYFILE_DATArárrrrÆÐ szTestZeroCopyMACOS.zerocopy_funN)rzr{r|rÐrÆrrrrrõÌ srõc@s^eZdZdd„Zdd„Zdd„Ze e  e j   ¡¡d¡e e edƒd ¡d d „ƒƒZd d „ZdS)ÚTestGetTerminalSizecCs(t ¡}| |jd¡| |jd¡dS)zÔCheck if get_terminal_size() returns a meaningful value. There's no easy portable way to actually check the size of the terminal, so let's check if it returns something sensible instead. rN)rƒÚget_terminal_sizerÚcolumnsÚlines)rxr@rrrÚtest_does_not_crashÕ sz'TestGetTerminalSize.test_does_not_crashcCsœt ¡&}d|d<|d=t ¡}Wdƒn1s40Y| |jd¡t ¡&}|d=d|d<t ¡}Wdƒn1s€0Y| |jd¡dS)z.Check if environment variables have precedenceZ777ÚCOLUMNSÚLINESNi Z888ix)rr?rƒrúr’rûrü©rxrAr@rrrÚtest_os_environ_firstß s & &z)TestGetTerminalSize.test_os_environ_firstcCs`t ¡(}d|d<d|d<t ¡}Wdƒn1s60Y| |jd¡| |jd¡dS)NrerþZyyyrÿr)rr?rƒrúrrûrürrrrÚtest_bad_environî s  &z$TestGetTerminalSize.test_bad_environz not on ttyrúzneed os.get_terminal_size()c Cs¤zt ddg¡ ¡ ¡}Wn$tttjfy>| d¡Yn0t|dƒt|dƒf}t   ¡$}|d=|d=t   ¡}Wdƒn1sŠ0Y|  ||¡dS) zíCheck if stty returns the same results ignoring env This test will fail if stdin and stdout are connected to different terminals with different sizes. Nevertheless, such situations should be pretty rare. Zsttyr@zstty invocation failedrhrrÿrþN)rmrÊrÎrpr«r!rÌr.rqrr?rƒrúr’)rxr@rûrArõrrrÚtest_stty_matchö s ÿ  &z#TestGetTerminalSize.test_stty_matchc Cst ¡ô}|d=|d=t tdd¡tjdd}Wdƒn1sF0Y| |jd¡| |jd¡t t j dƒJ}t td|¡tjd d}Wdƒn1sª0YWdƒn1sÈ0Y| |jd ¡| |jd ¡Wdƒn1s0YdS) NrÿrþÚ __stdout__)é é)Úfallbackrrr()éé(rr ) rr?rHrkrƒrúr’rûrür-rÚdevnull)rxrAr@rCrrrÚ test_fallback s * ÿHz!TestGetTerminalSize.test_fallbackN)rzr{r|rýrrrårærÚisattyrkrr]rYrr rrrrrùÔ s  ÿ rùc@seZdZdZdd„ZdS)ÚPublicAPITestsz>Ensures that the correct values are exposed in the public API.cCsP| ttdƒ¡gd¢}ttdƒs,tjdkr6| d¡| ttjƒt|ƒ¡dS)NÚ__all__)r¸r‹rNr[rƒr†rðrZrwrrÚ ExecErrorrrrrr rr rrrr rúr Ústatvfsrr ) rrYrƒrrQrNr’rr)rxZ target_apirrrÚtest_module_all_attribute% s  z(PublicAPITests.test_module_all_attributeN)rzr{r|rÙrrrrrr " sr Ú__main__)F)F)NråZ unittest.mockrƒrZrkr¾rZos.pathrr$rrmr6r8rÁrÝrrrrrrrr r r r r r¢r¿r÷Ú ImportErrorrérZ test.supportrrr/rŠr‹rèrr©rjrÙrÛrØr¢rr&r1rDrHrOreZSUPPORTS_SENDFILErrrsZTestCaser}rérHr—r r rWrXrrªr¨rÃrçrÚrõrùr rzÚmainrrrrÚsž8              [PgP< s\Jd v N