a ze@sHddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZddlZddlZz ddlZWneydZYn0ddl m!Z!ddl"m#Z#m$Z$e#dZ%e#dZ&e#dZ'ej()dZ*ej()d Z+ej(dd d kZ,zddl-Z-ddl.Z.d Z/Wneyzd Z/Yn0z ddl0Z0WneydZ0Yn0ddZ1ddZ2dAddZ3ddZ4dBddZ5ddZ6ddZ7e7Z8ddZ9GdddZ:Gd d!d!e:ej;ZGd&d'd'e:ej;Z?Gd(d)d)e:ej;Z@Gd*d+d+e:ej;ZAGd,d-d-eAZBGd.d/d/e:ej;ZCGd0d1d1ej;ZDGd2d3d3ej;ZEGd4d5d5eFZGeHe8 d6Gd7d8d8eGej;ZIeHe* d9Gd:d;d;eGej;ZJGdd?d?ej;ZLeMd@krDeNdS)CN) make_archiveregister_archive_formatunregister_archive_formatget_archive_formatsErrorunpack_archiveregister_unpack_format RegistryErrorunregister_unpack_formatget_unpack_formats SameFileError_GiveupOnFastCopy)support)TESTFNFakePath2Z_SRCZ_DSTdarwinZsunosZaixTFcOstttddddS)NZEXDEVzInvalid cross-device link)OSErrorgetattrerrnoargskwargsrD/opt/bitninja-python-dojo/embedded/lib/python3.9/test/test_shutil.py _fake_rename5srcstfdd}|S)Ncs0z"tj}tt_|i|W|t_S|t_0dSN)osrenamer)rrZbuiltin_renamefuncrrwrap:szmock_rename..wrap) functoolswraps)r"r#rr!r mock_rename9sr&cCsVt|trtjj|}t||r"dnd}||Wdn1sH0YdS)zWrite *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. wbwN) isinstancetuplerpathjoinopenwrite)r+Zcontentbinaryfprrr write_fileDs  r1cCsdd}t|d}dddt|D}t|d*}|||D]}||q@Wdn1sd0Ytj||ksJdS) zBCreate a test file with an arbitrary size and random text content.css2||ks J||kr$|V||8}q |r.|VdSrr)totalsteprrrchunksRs   zwrite_test_file..chunksi cSsg|]}ttjqSr)randomchoicestring ascii_lettersencode).0irrr [sz#write_test_file..r'N)minr,ranger-r.rr+getsize)r+sizer4bufsizechunkfZcsizerrrwrite_test_filePs   *rEcCsTt|trtjj|}t||r"dnd}|WdS1sF0YdS)zReturn 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. rbrN)r)r*rr+r,r-read)r+r/r0rrr read_filebs  rIcCs|g}tt|D]d}tj||}tj|rltj|sl||dt|D]}||d|qRq||q|S)N/) sortedrlistdirr+r,isdirislinkappendrlistdir)r+resnamepnrrrrPns  rPc CsttdsdSd}d}ztjdtdd }|j}|dWdn1sT0Yt|d }tjdtdd}|j}|}|}zt ||ddWnTt yYWdWdW|durt ||durt |dS0WdWdW|dur0t ||durDt |d SWdn1s^0YWdn1s~0YW|durt ||durt |n*|durt ||durt |0dS) NsendfileFr'dirdeletes 0123456789rFrT) hasattrrtempfileNamedTemporaryFilegetcwdrRr.r-filenorUrrunlink)srcnamedstnamerDsrcdstinfdoutfdrrrsupports_file2file_sendfilezsH (      F      rfcCsJtrBtjdkrBtdtj}|ddd}t|ddkSdSdS) Niz/usr/bin/dump -o %s i T)AIXsysmaxsize subprocess getoutput executablesplitint)ZhdrsZmaxdatarrr _maxdataOKs rsc@seZdZdddZdS)BaseTestNcCs$tj|td}|tj||S)zjCreate a temporary directory that will be cleaned up. Returns the path of the directory. )prefixrW)r[mkdtemprr] addCleanuprrmtree)selfrudrrrrvszBaseTest.mkdtemp)N)__name__ __module__ __qualname__rvrrrrrtsrtc@seZdZddZejddZejddZe e ddd Z e e dd d Z d d Z eejdddkdeeedoedkdddZddZddZddZddZejdd Ze e dd!d"ZdS)# TestRmTreecCsX|}tj|d}t|ttj|ddt|}||tt |dS)NZkillmeZsomefilefoo) rvrr+r,mkdirr1fsencodeassertIsInstancebytesshutilrx)rytmpZvictimrrrtest_rmtree_works_on_bytess   z%TestRmTree.test_rmtree_works_on_bytescs|}tj|d}t|tj|d}t|||ttj || tj || tj |gfdd}tj ||d| td|ddtjj| dd||dddtdS) NrWlinkcs|dSrrOrerrorsrronerrorsz8TestRmTree.test_rmtree_fails_on_symlink..onerrorrrirrY)rvrr+r,rsymlink assertRaisesrrrx assertTrueexistslexists assertEquallenassertIsrNrryrZdir_rrrrrtest_rmtree_fails_on_symlinks   z'TestRmTree.test_rmtree_fails_on_symlinkc Cs|}tj|d}tj|d}tj|d}|||fD]}t|q.onerrorrrirrY)rvrr+r,r_winapiCreateJunctionrwrr_rrrrxrrrrrrrNrrrrrtest_rmtree_fails_on_junctionss    z)TestRmTree.test_rmtree_fails_on_junctionsc Cs|}tj|d}tj|d}tj|d}|||fD]}t|q.onerrorrrYrri)r[mktemprvrFileNotFoundErrorrrxr1rr+r,NotADirectoryErrorassertIn exceptionfilenamerrrrrscandirrrmdir)ryrtmpdircmZ possible_argsrrrrtest_rmtree_errorss2 ( zTestRmTree.test_rmtree_errorsNcygwinz2This test can't be run on Cygwin (issue #1071513).geteuidrz9This test can't be run reliably as root (issue #1076467).cCs d|_tt|tjttjtd|_ tjtd|_ t |j t|j t tj}t |j j}t |j j}t jt jB}t|j |t|j |tt||tjt||tj|j ||tj|j |tjt|jd||jdddS)Nrabrrz1Expected call to onerror function did not happen.) errorStaterrrrwrrxr+r,child_file_pathchild_dir_pathrcreate_empty_filestatst_modeS_IREADS_IEXECchmodcheck_args_to_onerrorr)ryZ old_dir_modeZold_child_file_modeZold_child_dir_modeZnew_moderrr test_on_error4s*       zTestRmTree.test_on_errorcCs|jdkr|tjur$|||jn:|tjur>|||jn ||tj| |t |jg| t |dt |jd7_n4||tj||t | t |dt d|_dS)NrYrrir)rrr_rrrrrrLrrr issubclassr)ryr"argexcrrrrSs    z TestRmTree.check_args_to_onerrorcsRzDtjfdd}|t_ttttdfdttWt_nt_0dS)Ncs|tkrtn|SdSr)rr)fnrrZ orig_lstatrrraiserqszFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat..raiserr)rlstatrrr1rrx)ryrrrr+test_rmtree_does_not_choke_on_failing_lstatns   z6TestRmTree.test_rmtree_does_not_choke_on_failing_lstatcstjtjtjtjhtjko0tjtjvo0tjtjv}|r| t j | t j j |}tj|d}t|zBt j}Gdddtfdd}|t _|t j |W|t _q|t _0n|t j |t j j dS)Nrc@s eZdZdS)zHTestRmTree.test_rmtree_uses_safe_fd_version_if_available..CalledN)r{r|r}rrrrCalledr5rcsdSrrrrrr_raiserszITestRmTree.test_rmtree_uses_safe_fd_version_if_available.._raiser)rr-rr_rsupports_dir_fdrL supports_fdsupports_follow_symlinksrr_use_fd_functionsrxavoids_symlink_attacksrvr+r,r_rmtree_safe_fd Exceptionrr)ryrtmp_dirrzZ real_rmtreerrrr-test_rmtree_uses_safe_fd_version_if_available~s,      z8TestRmTree.test_rmtree_uses_safe_fd_version_if_availablecCs<tj|d\}}t||ttj|t |dSNr) r[mkstemprvrcloserrrrxremove)ryhandler+rrrtest_rmtree_dont_delete_files z'TestRmTree.test_rmtree_dont_delete_filec Csttzbtjtd}tjtd}t|t|||ttj |tj |ddWtj tddntj tdd0dS)NcheeseshopTr) rrrr+r,rrrrrxryrbrcrrrtest_rmtree_on_symlinks   z!TestRmTree.test_rmtree_on_symlinkc Csttzztjtd}tjtd}t|ttj|ddt||| t t j |t j |ddWt j tddnt j tdd0dS)NrrZspamr'Tr) rrrr+r,r-rrrrrrrxrrrrtest_rmtree_on_junctions   z"TestRmTree.test_rmtree_on_junction)r{r|r}rrskip_unless_symlinkrrunittest skipUnlessrrrrskipIfrlplatformrZrrrrrrrrrrrrrr~s2       $  r~c@seZdZddZddZejddZddZd d Z d d Z e j d ddZddZe eeddejddZddZejddZejddZddZddZd S)! TestCopyTreec Cs|}tj|d}|tj||tjtj|t|dfdt tj|dt|ddfdt ||| tj tj|d| tj tj|d| tj tj|ddt|df}||dt|ddf}||ddS)N destinationtest.txt123test_dir456)rvrr+r,rwrrxdirnamer1rcopytreerisfilerMrIrrysrc_dirdst_diractualrrrtest_copytree_simples"   z!TestCopyTree.test_copytree_simplec CsZ|}|}|tj||tj|t|dfdttj|dttj|dt|ddfdt|ddfdtj ||dd| tj tj|d| tj tj|d| tj tj|ddt |df}||dt |ddf}||d|t tj ||d dWdn1sL0YdS) Nznonexisting.txtrZ existing_dirz existing.txtzwill be replacedzhas been replacedT) dirs_exist_okF)rvrwrrxr1rrr+r,rrrrMrIrrFileExistsErrorrrrrtest_copytree_dirs_exist_oks*    z(TestCopyTree.test_copytree_dirs_exist_okc Cs|}tj|d}tj|d}tj|d}t|t|t|dfdtj|d}tj|d}ttj|d|ttdrt|t j t j Bttd rtt d rt |t j t|}tj||d d |tjtj|ddttj|dd}tjd kr8|dr8|dd}||tj|dt|} ttdrt|| j|jttd r|| j|jdS)Nrbrcsubzfile.txtrrzsub/linklchmodlchflags UF_NODUMPTsymlinksntz\\?\)rvrr+r,rr1rrZrrS_IRWXUS_IRWXOrrrrrrrNreadlinkrR startswithrrst_flags) ryrrrZsub_dirsrc_linkdst_linksrc_statrdst_statrrrtest_copytree_symlinkss8        z#TestCopyTree.test_copytree_symlinksc Cs^tjj}tjj}|}z ||d}t|dfdt|dfdt||dt|ddfdt||dt|ddfdt||ddt||dd t|dddfdt|dd d fdzftd d}tj |||d | |||d| |||d| |||dWt |n t |0zjtd d }tj |||d | |||d| |||dd | |||ddWt |n t |0zTdd}tj |||d | |||dd d | |||ddWt |n t |0Wt |t tj |nt |t tj |0dS)Nrrrztest.tmprrZ test_dir2subdirZsubdir2ztest.pyz*.tmpignorezsubdir*cSsfg}|D]X}tj||}tj|rB|ddkrB||qtj|ddvr||q|S)Nrhr z.py)rr+r,rMrqrOsplitext)rbnamesrQrRr+rrr_filter0s   z8TestCopyTree.test_copytree_with_exclude.._filter)rr+r,rrvr1rrignore_patternsrrrrxr)ryr,rrrpatternsrrrrtest_copytree_with_excludesR     z'TestCopyTree.test_copytree_with_excludecsVtjj}tjj}}||d}t||t||dttj|ddt|dddfdgfdd}|d}tj|||d  |||ddd|d}tjt |||d  |||ddd|d}t t |d }|tjtj|||d  |||dddtd dS) Nsourcerr rrcsT||t|tt|tt||D]}|tq>gSr)rOrstrlistrrset)rbrrRZ invokationsryrr_ignoreWs   z?TestCopyTree.test_copytree_arg_types_of_ignore.._ignorerrr )rr+r,rrvrr1rrrpathlibPathrrrDirEntryrr)ryr,rrrrrZ src_dir_entryrrr!test_copytree_arg_types_of_ignoreIs8  z.TestCopyTree.test_copytree_arg_types_of_ignorec Csx|}tj|d}t|tj|d}|tj|t|dt |dfdttj|ddt |dfdttj|ddt j|d }|t j|t|dt ||| t|jt|j| ttj|djttj|dj| ttj|djttj|djtj|tj|d }| t|jt|jdS) Nrrizpermissive.txtrzrestrictive.txtrirri)rvrr+r,rrwrrxrr1r[rrrrrrq)ryrrrZrestrictive_subdirZrestrictive_subdir_dstrrr!test_copytree_retains_permissionsss6      z.TestCopyTree.test_copytree_retains_permissionszos.chmodcCs|}tj|d}|tj||tjtj|td|_ | tj t ||Wdn1sv0YdS)Nrzka-boom) rvrr+r,rwrrxrPermissionError side_effectrrr)ryZ mock_patchrrrrrtest_copytree_winerrors z#TestCopyTree.test_copytree_winerrorcsfdd}gtjdttjdd}|Wdn1s`0Ytj |d t ddS)NcsRd|t|t|tjd|tjddSNr)rOrrrrr+r,)rrrcflagryrbrr custom_cpfuns    zETestCopyTree.test_copytree_custom_copy_function..custom_cpfunrrr( copy_functionri) rvr[rr-rr+r,rrrrr)ryr(rDrr&r"test_copytree_custom_copy_functions&z/TestCopyTree.test_copytree_custom_copy_functionmkfiforequires os.mkfifo()c Cs2ttztjtd}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|dWtjtdd tjt dd ntjtdd tjt dd 0dS) Nr Zmypipeos.mkfifo(): %srriz`%s` is a named pipez$shutil.Error should have been raisedTr)rrrr+r,r,r"skipTestrrTESTFN2rrrrfailrx)ryr pipeerrbrcZ error_msgrrrtest_copytree_named_pipes*  $ & z%TestCopyTree.test_copytree_named_pipecs|}tj|d}t|dfdttj|dt|ddfdgfdd}tj|||d|t d dS) Nrrrrrcs||fdSrrrbrcZcopiedrr_copysz6TestCopyTree.test_copytree_special_func.._copyr)rY) rvrr+r,r1rrrrr)ryrrr7rr6rtest_copytree_special_funcs z'TestCopyTree.test_copytree_special_funccCs|}tj|d}tdtj|dttj|dt|ddfd|tt j ||tj|d}t j ||dd| dt |tj|d }t j ||dd | dt |dS) NrZ IDONTEXISTrrr destination2T)ignore_dangling_symlinksZ destination3r)rvrr+r,rrr1rrrr assertNotInrLrryrrrrrtest_copytree_dangling_symlinkssz,TestCopyTree.test_copytree_dangling_symlinksc Cs.|}tj|d}ttj|dttj|dddWdn1sZ0Ytjtj|dtj|dddtj||dd | tj tj|d| dt tj|dtj|d }tj||dd | tj tj|d| dt tj|ddS) NrZreal_dirrr(Z link_to_dirT)target_is_directoryFrr9)rvrr+r,rr-rrrrrNrrLrr<rrrtest_copytree_symlink_dirs  z&TestCopyTree.test_copytree_symlink_dircCs\|}|d}|tj|dtj|d}t|dt||}| dgt |dS)NdestTr) rvrwrrxrr+r,r1rrrL)ryrrrbrvrrrtest_copytree_return_values  z'TestCopyTree.test_copytree_return_valuecCs|}|jtj|ddtj|dd}tj|dd}t|tj|d}t|dt ||}| dgt |dS)NTrtZpgZ somevendorz1.0Zpol) rvrwrrxrr+r,makedirsr1rrrL)rybase_dirrrrbrArrrtest_copytree_subdirectorys   z'TestCopyTree.test_copytree_subdirectoryN)r{r|r}rrrrr rr r!rmockpatchr$r+rrZrr4r8r=r?rBrFrrrrrs( A*      rc@seZdZejddZeee ddejddZ e ee ddejdd Z ejd d Z eee d oeed oeeddddZejddZejejeee doe dkdddZddZddZejddZeee dd d!d"Zejd#d$Zejd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zejd/d0Zeee d1d2d3d4Zejd5d6Z eee d7d8d9d:Z!d;d<Z"d=d>Z#e e$pe%pe&d?d@dAZ'dBdCZ(dDS)ETestCopycCs|}tj|d}tj|d}tj|d}tj|d}t|dt|dt||t||t|tjtj Bt|tj | t|j t|j t |||t|j t|j tjdkrt|tj t |||t|j t|j t|tj t |||t|j t|j t|tj t |||t|j t|j dS)Nrbarbazquuxr)rvrr+r,r1rrrrS_IRWXGrassertNotEqualrrcopymoderrRryrrbrcrr rrrtest_copymode_follow_symlinkss0         z&TestCopy.test_copymode_follow_symlinksrzrequires os.lchmodcCsp|}tj|d}tj|d}tj|d}tj|d}t|dt|dt||t||t|tjtj Bt|tjt |tj tj Bt |tj t j ||dd|t|jt|j|t|jt|jt |tj t j ||dd|t|jt|jt |tj t j ||dd|t|jt|jdSNrrJrKrLFfollow_symlinks)rvrr+r,r1rrrrrMrrrrOrrrrNrPrrr test_copymode_symlink_to_symlink7s0     z)TestCopy.test_copymode_symlink_to_symlinkz requires os.lchmod to be missingcCs|}tj|d}tj|d}tj|d}tj|d}t|dt|dt||t||tj||dddSrR)rvrr+r,r1rrrOrPrrr*test_copymode_symlink_to_symlink_wo_lchmodUs    z3TestCopy.test_copymode_symlink_to_symlink_wo_lchmodc Cs|}tj|d}tj|d}tj|d}tj|d}t|dt|}t||j|jdft|d| t|jt|jt ||t ||t tdrt |tj t tdrt tdrt|tjt|}t tdr tj||d d | |jt|jtj||d d t|}tjtjvrpd D]"} |t|| t|| d qLt tdr||j|jt tdrt |dr||j|jtj||d d |tt|jt|jdkdS)NrrJrKquxgE@rrrTrSFst_atimest_mtimerirg?)rvrr+r,r1rutimerYrZrNrrZrrrrrrcopystatrrassertLessEqualrrrrabs) ryrrbrcrr r  src_link_statZ dst_link_statattrrrrtest_copystat_symlinksesJ             zTestCopy.test_copystat_symlinkschflags EOPNOTSUPPENOTSUPz)requires os.chflags, EOPNOTSUPP & ENOTSUPcCs|}tj|d}tj|d}t|dt|ddd}tj}zVtjtjfD]}||t_t ||qT|tjtjt_| t t j ||W|t_n|t_0dS)Nrfile2xxxcstddfdd }|S)NTrScs_dSr)r)r+flagsrTerrexrr_chflags_raiserszlTestCopy.test_copystat_handles_harmless_chflags_errors..make_chflags_raiser.._chflags_raiserr)rirkrrhrmake_chflags_raiserszSTestCopy.test_copystat_handles_harmless_chflags_errors..make_chflags_raiser) rvrr+r,r1rbrrcrdrr\rr)ryrrrermZ old_chflagsrirrr-test_copystat_handles_harmless_chflags_errorss   z6TestCopy.test_copystat_handles_harmless_chflags_errorscs |}tj|dtdtj|d}t|dt|tddtddt||t t t t ||t dt |dt |t|dt tjdfdd }z4tj|t_t||dt |Wt_nt_0d d fd d }z"tj |t_ t|Wt_ nt_ 0tj|dtj|d}tt||tddt|ddt|dtj|d}tj|d}t||t||t|t|||t |dd|t |dddS)NrrJuser.foo42zuser.bar43EPERMcs&|dkrn|||fi|dS)Nror)fnamer`valr) orig_setxattros_errorrr_raise_on_user_foosz3TestCopy.test_copyxattr.._raise_on_user_fooTrScs |krttjd||dS)NzOperation not supportedrS)rrrd)rsrT)orig_listxattrrbrr _raise_on_srcs z.TestCopy.test_copyxattr.._raise_on_srcZ the_originalZthe_original_rozuser.the_valuesfiddlyi$Zthe_copyZ the_copy_ro)rvrr+r,r1r _copyxattrsetxattrrrK listxattrgetxattrrrrrrrrr\)ryrrcrwryZsrcroZdstror)rxrurvrbrtest_copyxattrsZ                  zTestCopy.test_copyxattrrrroot privileges requiredcCs|}tj|d}tj|d}t|dt||t|ddtj|ddddtj|d}tj|d }t|dt||tj||dd| tj |dddd| t tj |dtj||dd| t |dddS) NrrKz trusted.foorprqFrSrJrW) rvrr+r,r1rr{rrzrr}rr)ryrrbrrcr rrrtest_copyxattr_symlinkss     z TestCopy.test_copyxattr_symlinkscCsPd}|}t||fdtj||}|}|||tj||}||fS)Nrrf)rvr1rr+r,)rymethodrsrrtmpdir2rerrr _copy_files zTestCopy._copy_filecCsB|tj\}}|tj||t|j t|j dSr) rrcopyrrr+rrrr)ryrrerrr test_copyszTestCopy.test_copycCs |}tj|d}tj|d}tj|d}t|dt||ttdrft|tj tj Bt j ||dd| tj||t|t|t|t j ||dd|tj||t|t|ttdr|t|jt|jdS)NrrJrKrTrSF)rvrr+r,r1rrZrrrrrrrrNrrIrrrrr)ryrrbrcrrrrtest_copy_symlinkss&      zTestCopy.test_copy_symlinksr[zrequires os.utimecCs|tj\}}|tj|t|}t|}||j |j dD] }| t ||t ||dqJt tdrt |dr|t |dt |ddS)NrXrirbr) rrcopy2rrr+rrrrr]rrZ)ryrreZ file1_statZ file2_statr`rrr test_copy21s     zTestCopy.test_copy2c Cs|}tj|d}tj|d}tj|d}t|dt||ttdrft|tj tj Bttdrttdrt |tj t|}t |}tj||dd|tj||t|t|t|tj||d d|tj||t|t|t |}tjtjvrVd D]"}|t||t||d q2ttdr||j|j||j|jttdrt|d r||j|jdS) NrrJrKrrrTrSFrXrir)rvrr+r,r1rrZrrrrrrrrrrrNrrIrrrr[rr]rrrNr) ryrrbrcrr r_r r`rrrtest_copy2_symlinksBs<          zTestCopy.test_copy2_symlinkscCsr|}tj|d}tj|d}t|dt|ddt|||t |dt |dt |dS)NrrJrorp) rvrr+r,r1r{rrrr}r)ryrrbrcrrrtest_copy2_xattres    zTestCopy.test_copy2_xattrcCstjtjfD]v}|}|}tj|d}t|d|||}||tj|d||tj|d}||tj|dq dS)NrrJ) rrrrvrr+r,r1r)ryrrrrbrArrrtest_copy_return_valuers  zTestCopy.test_copy_return_valuecCs|tjdSr)_test_copy_dirrrryrrr test_copy_dir~szTestCopy.test_copy_dircCs|tjdSr)rrrrrrrtest_copy2_dirszTestCopy.test_copy2_dircCsx|}tj|d}|}tj|d}t|dtjdkrFt}nt}| ||||| |||||||dSNrdoes_not_exist/win32) rvrr+r,r1rlrr"IsADirectoryErrorr)ryZ copy_funcrsrc_filerrcrirrrrs  zTestCopy._test_copy_dircCs|}tj|d}tj|d}tj|d}tj|d}t|dt||tj||dd|tj || t |t |t||| tj |dS)Nrbrcr rrFrS) rvrr+r,r1rrcopyfilerrNrrr)ryrrbrcr rrrrtest_copyfile_symlinkss   zTestCopy.test_copyfile_symlinksrzrequires os.linkc Cstttjtd}tjtd}zt|d}|dWdn1sR0Yzt||Wn2ty}z| d|WYd}~n d}~00| t j t j ||t|d }||dWdn1s0Yt|Wt jtddnt jtdd0dS) Nrrr(cheddarz os.link(): %srGTr)rrrr+r,r-r.rr"r/rrr rrrHrrx)ryrbrcrDr3rrr'test_dont_copy_file_onto_link_to_itselfs  ($ . z0TestCopy.test_dont_copy_file_onto_link_to_itselfc Cstttjtd}tjtd}zt|d}|dWdn1sR0Ytd||t j t j ||t|d }| | dWdn1s0Yt|Wt jtddnt jtdd0dS)Nrrr(rrGTr)rrrr+r,r-r.rrrr rrrHrrx)ryrbrcrDrrr*test_dont_copy_file_onto_symlink_to_itselfs  (  . z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr,r-c CszttWn2ty@}z|d|WYd}~n d}~00z6|tjtjtt |tjtjt tWt tn t t0dS)Nr.) rr,rr"r/rrSpecialFileErrorrr0__file__r)ryr3rrrtest_copyfile_named_pipes$z!TestCopy.test_copyfile_named_pipecCsl|}|}tj|d}tj|d}t|dt||}|tj|| t |t |dS)NrJr) rvrr+r,r1rrrrrrI)ryrrdst_filerrArrrtest_copyfile_return_values  z#TestCopy.test_copyfile_return_valuecCsX|}tj|d}t|d|ttj|||t tj||| t |ddSr%) rvrr+r,r1rr rrrrrI)ryrrrrrtest_copyfile_same_files  z TestCopy.test_copyfile_same_filezMOn MACOS, Solaris and Windows the errors are not confusing (though different)cCsD|}tj|d}tj|d}t|d|ttj||dS)Nrr) rvrr+r,r1rrrr)ryrrrcrrrtest_copyfile_nonexistent_dirs  z&TestCopy.test_copyfile_nonexistent_dircCs|}tj|d}|}tj|d}t|dtjdkrFt}nt}| |t j ||| |t j ||| |t j ||dSr) rvrr+r,r1rlrr"rrrr)ryrrrrcrirrrtest_copyfile_copy_dirs  zTestCopy.test_copyfile_copy_dirN))r{r|r}rrrQrrrZrrUrrVrarrnZskip_unless_xattrr~rrrrrrrrrrrrrrrrrrMACOSSOLARISrrrrrrrrIsh    (  ?    "         rIc@sveZdZeddZddZd7ddZee e dd d d Z ed d Z ee e ddddZee e ddddZddZeddZee edddZddZdd Zed!d"Zd#d$Zd%d&Zd'd(Zd)d*Zed+d,Zed-d.Zeee oJe! d/d0d1Z"ed2d3Z#d4d5Z$d6S)8 TestArchivesc Cs|d\}}|}t|tj|}tjtj|d}t |*tj |}t |d|d}Wdn1s|0Y| ||d| tj|| t|t|d$}||gdWdn1s0Yt |t |d|d}Wdn1s(0Y| ||d | tj|| t|t|d $}||gdWdn1s0YdS) Nrarchivegztar..tar.gzzr:gz)rz./subz./sub2z./file1z./file2z ./sub/file3tar.tarrG) _create_filesrvrrr+rr,basenamer change_cwdabspathrrrrtarfileZ is_tarfiler-assertCountEqualgetnames) ryroot_dirrErwork_dir rel_base_name base_nametarballZtfrrrtest_make_tarballs0    , " . zTestArchives.test_make_tarballcCsFt|(}|}|t|WdS1s80YdSr)rr-rsortr*)ryr+rrrrr_tarinfo9s zTestArchives._tarinfodistcCs|}tj||}tj|ddt|dfdt|dfdttj|dt|ddfdttj|d|rt|d fd||fS) NT)exist_okrrfrerZfile3Zsub2outer)rvrr+r,rDr1r)ryrErrrrrr?szTestArchives._create_filesrzNeed 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) Nrrrz archive2.tarrz-cfcwdstdoutrT)dry_run) rrr+r,rvrrrrrn check_callDEVNULLr)ryrrErrZtarball2Ztar_cmdrrrtest_tarfile_vs_tarMs(   z TestArchives.test_tarfile_vs_tarc Cs|\}}|}t|tj|}tjtj|d}t |(tj |}t |d|}Wdn1sx0Y| ||d| tj|| t|t|$}||gdWdn1s0Yt |*tj |}t |d||}Wdn1s.0Y| ||d| tj|| t|t|$}||gdWdn1s0YdS)Nrzip.zip)dist/ dist/sub/ dist/sub2/ dist/file1 dist/file2dist/sub/file3r)rrrrrr)rrvrrr+rr,rrrrrrrrzipfile is_zipfileZipFilernamelist) ryrrErrrrrQzfrrrtest_make_zipfilens2     *  "  .  zTestArchives.test_make_zipfilerzNeed the zip command to runc Cs |\}}tj|d}t|d||}|||d|tj|tj|d}dddd|g}t j ||t j d|tj|t |}|}Wdn1s0Yt |}|} Wdn1s0Y|t|t| dS)Nrrrz archive2.zipz-qz-rr)rrr+r,rvrrrrrnrrrrrrK) ryrrErrZarchive2zip_cmdrrZnames2rrrtest_zipfile_vs_zips   & &z TestArchives.test_zipfile_vs_zipunzipzNeed 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}~00Wdn1s0YdS) Nrrrrz-t)stderrreplacerzunrecognized option: tzunzip doesn't support -tz{} **Unzip Output** {})rrr+r,rvrrrrrrrn check_outputSTDOUTCalledProcessErroroutputdecoder/r1format) ryrrErrrrZdetailsmsgrrrtest_unzip_zipfiles    zTestArchives.test_unzip_zipfilecCs*|}tj|d}|tt|ddS)Nrrf)rvrr+r,r ValueErrorr)ryrrrrrtest_make_archiveszTestArchives.test_make_archivecCstr"tdd}tdd}nd}}|\}}tj| d}t |d||||d}| tj |t |d||}| tj |t |d||||d}| tj |t |d||ddd}| tj |dS) NrrootrrownergrouprZ kjhkjhkjgZoihohoh) UID_GID_SUPPORTgrpgetgrgidpwdgetpwuidrrr+r,rvrrr)ryrrrrErrQrrrtest_make_archive_owner_groups(    z*TestArchives.test_make_archive_owner_groupRequires grp and pwd supportc Cs|\}}tj|d}tdd}tdd}t |$t |d|d||d}Wdn1sn0Y| tj |t|}z6|D] }||jd||jdqW|n |0dS)Nrrrrr)rrr+r,rvrrrrrrrrrrr-Z getmembersruidgidr) ryrrErrr archive_namermemberrrrtest_tarfile_root_owners   $  z$TestArchives.test_tarfile_root_ownercCstt}dd}td|gdzFztdd|dWntyHYn0|t|Wtdn td0dS)Nc_s tdSr) RuntimeError)rkwrrr_breakssz3TestArchives.test_make_archive_cwd.._breaksrfxxx file)r)rr]rrrvrrr)ryZ current_dirrrrrtest_make_archive_cwds z"TestArchives.test_make_archive_cwdcCsZ|}t|4|tddd|tjdWdn1sL0YdS)Ntestrztest.tar rvrrrrrrr+rryrrrrtest_make_tarfile_in_curdir s z(TestArchives.test_make_tarfile_in_curdircCsZ|}t|4|tddd|tjdWdn1sL0YdS)Nrrztest.ziprrrrrtest_make_zipfile_in_curdirs z(TestArchives.test_make_zipfile_in_curdircCs|ttdd|ttdddd|ttdddddgtddddgd d d tD}|d|tdd d tD}|d|dS) NrfricSstSrxrrrrr5z;TestArchives.test_register_archive_format..cSstSrrrrrrr r5)rirY)rirYrcSstSrrrrrrr#r5rcSsg|] \}}|qSrrr;rRparamsrrrr=$r5z=TestArchives.test_register_archive_format..cSsg|] \}}|qSrrrrrrr=(r5)r TypeErrorrrrrr;)ryformatsrrrtest_register_archive_formats z)TestArchives.test_register_archive_formatcCs.||dd||tj||tdS)NcSs|Srrr+rrrr.r5z3TestArchives.check_unpack_archive..)#check_unpack_archive_with_converterrrr)ryrrrrcheck_unpack_archive-sz!TestArchives.check_unpack_archivec Cs|\}}t|}|dtj|d}t||||}|}t||||| t|||} t|||| |d| t| || t j t|t |j tt|t dddS)Nrr)rrf)rrPrrr+r,rvrrrrr ReadErrorrr) ryr converterrrEexpectedrrrZtmpdir3rrrr2s  z0TestArchives.check_unpack_archive_with_convertercCs|ddS)Nrrrrrrtest_unpack_archive_tarGsz$TestArchives.test_unpack_archive_tarcCs|ddS)Nrr rrrrtest_unpack_archive_gztarJsz&TestArchives.test_unpack_archive_gztarcCs|ddS)Nbztarr rrrrtest_unpack_archive_bztarNsz&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largercCs|ddS)Nxztarr rrrrtest_unpack_archive_xztarRsz&TestArchives.test_unpack_archive_xztarcCs|ddS)Nrr rrrrtest_unpack_archive_zipWsz$TestArchives.test_unpack_archive_zipcst}fdd}tdddg|dgtddttd dg|tdtd dg|d dgd ftddgd fttd t|dS) Ncs(|d|d|ddS)Nri stuff.booxx)r)r extract_dirextrarrr_boo_s  z/TestArchives.test_unpack_registry.._booZBooz.booz.b2)rrirrZBoo2r) r rrrr r rr;r)ryrrrrrtest_unpack_registry[s   z!TestArchives.test_unpack_registryN)r)%r{r|r}rZ requires_zlibrrrrrrwhichrrrrrrrrrrrrrrr r Z requires_bz2r Z requires_lzmarrkrsrrrrrrrrsZ #    $            rc@sLeZdZeeeddddZeedeee dddd Z d S) TestMisc disk_usagez)disk_usage not available on this platformcCsttjt}dD]}|t||tq| |j d| |j d| |j d| |j |j | |j |j ttdS)N)r2usedfreer)rrrr+rrrrrrZ assertGreaterr2rassertGreaterEqualr)ryusager`rrrtest_disk_usagexszTestMisc.test_disk_usagerchownzrequires os.chowncs}tj|dtdttWdn1sH0YttjddWdn1s0YttjddWdn1s0Yt tdWdn1s0Yt tdWdn1s&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)Nrztesting chown functionznon-existing username)userznon-existing groupname)rspamgQ @cs:t}|dur ||j|dur6||jdSr)rrrst_uidst_gid)r+rrsrryrr check_chowns  z(TestMisc.test_chown..check_chown)rr)NN)rvr[rr1rrrr LookupErrorrrgetuidgetgidrrrrKeyError)ryrrrr&r rrr%r test_chownsR   ( , , * ,           zTestMisc.test_chownN) r{r|r}rrrZrrrrr+rrrrrvs  rc@seZdZddZddZddZddZd d Ze e e d oHe d kd ddZ ddZddZeejdkdddZddZddZddZddZd d!Zd"d#Zeejdkd$d%d&Zeejdkd$d'd(Zd)S)* TestWhichcCst|jdd|_tj|jddd|_t|jjtj | |jj tj |jj\|_|_|j|_tj|_d|_dS)NZTmp)ruz.ExerWrusuffixz.EXE)rvtemp_dirr[r\ temp_filerrrRrS_IXUSRrwrr+rqrWfileenv_pathcurdirextrrrrsetUpszTestWhich.setUpcCs&tj|j|jd}|||jjdSNr)rrr2rWrr0rRryrArrr test_basicszTestWhich.test_basiccCs(tj|jj|jd}|||jjdSr7)rrr0rRr/rr8rrrtest_absolute_cmdszTestWhich.test_absolute_cmdcCstj|j\}}tj||j}tj|d,tj ||j d}| ||Wdn1s`0Ytj|jd(tj ||d}| |Wdn1s0YdSr7) rr+rqrWr,r2rrrrr/r assertIsNone)ryrEtail_dirrelpathrArrrtest_relative_cmds*zTestWhich.test_relative_cmdcCstj|j}tj|jdPtj|j|d}t j dkrT| |tj |j |jn ||Wdn1sr0YdS)Nrr)rr+rrWrrrrr2rlrrr,r4r;)ryrErArrrtest_cwds  zTestWhich.test_cwdrrznon-root user requiredcCsRt|jjtjt|jjtjr.|dt j |j |j tjd}| |dS)Nzcan't set the file read-only)r+mode)rrr0rRrraccessW_OKr/rrr2rWr;r8rrrtest_non_matching_modes  z TestWhich.test_non_matching_modecCsjtj|j\}}tj|d8tj|j|d}| |tj ||jWdn1s\0YdSr7) rr+rqrWrrrrr2rr,)ryrEr<rArrrtest_relative_pathszTestWhich.test_relative_pathcCstjd|jd}||dS)Nzfoo.exer)rrrWr;r8rrrtest_nonexistent_file szTestWhich.test_nonexistent_filerzpathext check is Windows-onlycCs<tj|jdd|jd}|||jjdd|jdS)Nr)rrr2rWrr0rRr5r8rrrtest_pathext_checkingszTestWhich.test_pathext_checkingcCsRt6}|j|d<t|j}|||jjWdn1sD0YdSNPATH) rEnvironmentVarGuardr3rrr2rr0rRryenvrArrrtest_environ_paths   zTestWhich.test_environ_pathc Cst}d|d<tjjd|jddttd|jRt|j&t |j }| |Wdn1sr0YWdn1s0YWdn1s0YWdn1s0YdS)NrrI os.confstrT return_valuecreatedefpath) rrJrrGrHrW swap_attrrrrrr2r;rKrrrtest_environ_path_emptys    z!TestWhich.test_environ_path_emptyc Cs:tj|jj}tjdkrBtj}t|t r4t |}tj ||}t }tj|d<tjjd|jddt td|jjt|j}||t |j(t|j}|||Wdn1s0YWdn1s0YWdn1s 0YWdn1s,0YdS)NrrIrNTrOrR)rr+rr0rRrlrr4r)rrr,rrJpathseprrGrHrWrSrrr2r;rr)ryZ expected_cwdr4rLrArrrtest_environ_path_cwd(s$         zTestWhich.test_environ_path_cwdc Cs8t}|ddtjjdtddLttd|j t |j }Wdn1s^0YWdn1s|0Y| ||jjtjjd|j ddJttddt |j }Wdn1s0YWdn1s0Y| ||jjWdn1s*0YdS)NrIrNT)r#rQrRrOr)rrJpoprrGrHrrSrrWrrr2rr0rRrKrrrtest_environ_path_missing>s    H  Hz#TestWhich.test_environ_path_missingc Cstj|j}tj|jd\t4}|j|d<tj |j dd}| |Wdn1s`0YWdn1s~0YdS)NrrIr) rr+rrWrrrJr3rrr2r;)ryrErLrArrrtest_empty_pathPs zTestWhich.test_empty_pathcCsNt2}|ddt|j}||Wdn1s@0YdSrH)rrJrWrrr2r;rKrrrtest_empty_path_no_PATHXs   z!TestWhich.test_empty_path_no_PATHztest specific to WindowscCsd}tj|jd|d}t|jtj||j tj |j}tj |d}t 6}||d<tj||jd}|||jWdn1s0YdS)N.xyzTmp2r-rPATHEXTr)r[r\r/rrrRrr1rwrr+rrrrJrrrryr5Z temp_filexyzZprogramrLrArrr test_pathext^s  zTestWhich.test_pathextcCsd}tj|jd|d}||jtj|j}tj |d}t <}|d|d<t j ||jd}|||jWdn1s0YdS)Nr[r\r-r;r]r)r[r\r/rwrrr+rrRrrrJrrrr^rrrtest_pathext_with_empty_strps  z%TestWhich.test_pathext_with_empty_strN)r{r|r}r6r9r:r>r?rrrZrrrCrDrErrlrrGrMrTrVrXrYrZr_rarrrrr,s2       r,c@seZdZddZdS)TestWhichBytescCsXt|t|j|_t|j|_t|jj|j_t|j|_t|j |_ dSr) r,r6rrrWr2r0rRr4r5rrrrr6s  zTestWhichBytes.setUpN)r{r|r}r6rrrrrbsrbc@seZdZddZddZddZddZd d Zd d Zd dZ e ddZ e ddZ ddZ e ddZddZe ddZddZeejjdddZd d!Zd"d#Zd$d%Zd&d'Zeje d(d)Zeje d*d+Zeje d,d-Z eje d.d/Z!d0d1Z"d2d3Z#e d4d5Z$e d6d7Z%d8d9Z&ee'ed:ove(d;kove'ed<ove'e)d=ove'e)d>d?d@dAZ*dBS)CTestMovecCsvd}||_||_tj|j||_tj|j||_t|jd}| dWdn1sh0YdS)Nrr'r!) rvrrrr+r,rrr-r.)ryrrDrrrr6s  zTestMove.setUpcCst|d}|}Wdn1s(0Yt||t|d }|||Wdn1sn0Y|tj|dSNrF) r-rHrmoverrrr+r)ryrbrcreal_dstrDcontentsrrr_check_move_files  &  .zTestMove._check_move_filecCsFtt|}t||||tt||tj|dSr) rKrrLrrerrr+r)ryrbrcrfrgrrr_check_move_dirs zTestMove._check_move_dircCs||j|j|jdSr)rhrrrrrrtest_move_fileszTestMove.test_move_filecCs||j|j|jdSr)rhrrrrrrrtest_move_file_to_dirszTestMove.test_move_file_to_dircCs"t|j}|||j|jdSr)rrrrhrr)ryrbrrr"test_move_file_to_dir_pathlike_srcs z+TestMove.test_move_file_to_dir_pathlike_srccCs"t|j}||j||jdSr)rrrrhrrryrcrrr"test_move_file_to_dir_pathlike_dsts z+TestMove.test_move_file_to_dir_pathlike_dstcCs |dSr)rjrrrrtest_move_file_other_fssz TestMove.test_move_file_other_fscCs |dSr)rkrrrrtest_move_file_to_dir_other_fssz'TestMove.test_move_file_to_dir_other_fsc Cs@tj|d}z||j||Wt|n t|0dSr)r[rrvrirrrxryrrrr test_move_dirszTestMove.test_move_dircCs |dSr)rrrrrrtest_move_dir_other_fsszTestMove.test_move_dir_other_fsc Cs,||j|jtj|jtj|jdSr)rirrrr+r,rrrrrtest_move_dir_to_dirs zTestMove.test_move_dir_to_dircCs |dSr)rtrrrrtest_move_dir_to_dir_other_fssz&TestMove.test_move_dir_to_dir_other_fsc Cs4||jtjj|jtj|jtj|jdSr)rirrr+seprr,rrrrrtest_move_dir_sep_to_dirsz!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc Cs4||jtjj|jtj|jtj|jdSr)rirrr+altseprr,rrrrrtest_move_dir_altsep_to_dirsz$TestMove.test_move_dir_altsep_to_dircCsHt|jdWdn1s"0Y|tjtj|j|jdS)Nr')r-rrrrrerrrrrr"test_existing_file_inside_dest_dirsz+TestMove.test_existing_file_inside_dest_dircCs*tj|jd}|tjtj|j|dSNrJ)rr+r,rrrrrermrrrtest_dont_move_dir_in_itselfsz%TestMove.test_dont_move_dir_in_itselfc CsrttzVdD]B\}}tjt|}tjt|}|jt||d||fdqWt tn t t0dS)N))srcdirz srcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s)r) rrrr+r,rr _destinsrcrrxrrrrtest_destinsrc_false_negatives   z&TestMove.test_destinsrc_false_negativec CsrttzVdD]B\}}tjt|}tjt|}|jt||d||fdqWt tn t t0dS)N))r}zsrc/dest)r}z srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s)r~) rrrr+r,rrrrrxrrrrtest_destinsrc_false_positives   z&TestMove.test_destinsrc_false_positivecCs\tj|jd}t|j|t||j| tj |j| tj |j|jdSr{) rr+r,rrrrrerrrNsamefilermrrrtest_move_file_symlinks zTestMove.test_move_file_symlinkcCsld}tj|j|}t|j|t||jtj|j|}| tj || tj |j|dSr{) rr+r,rrrrrerrrNr)ryrrcZ final_linkrrrtest_move_file_symlink_to_dir sz&TestMove.test_move_file_symlink_to_dircCsztj|jd}tj|jd}t||tj|jd}t|||tj || tj |tj |dSNrKrJrL) rr+r,rrrrrerrNrrealpathryrbrcr rrrtest_move_dangling_symlinks  z#TestMove.test_move_dangling_symlinkcCs|tj|jd}tj|jd}t|t||tj|jd}t||| tj || tj ||dSr) rr+r,rrrrrrerrNrrrrrtest_move_dir_symlink"s   zTestMove.test_move_dir_symlinkc Cs6t|j|j}||tj|jtj|jdSr) rrerrrrr+r,rr8rrrtest_move_return_value.szTestMove.test_move_return_valuecCs6t|jtj|jd}||tj|jddSr{)rrerrr+r,rrr8rrr test_move_as_rename_return_value3sz)TestMove.test_move_as_rename_return_valuecs8gfdd}tj|j|j|d|tddS)Ncs||fdSrrr5Zmovedrrr7:sz7TestMove.test_move_file_special_function.._copyr)ri)rrerrrrryr7rrrtest_move_file_special_function7s z(TestMove.test_move_file_special_functioncsdgfdd}ttj|jdttj|jdtj|j|j|d| t ddS)Ncs||fdSrrr5rrrr7Bsz6TestMove.test_move_dir_special_function.._copychildZchild1r)r) rrrr+r,rrrerrrrrrrtest_move_dir_special_function?s  z'TestMove.test_move_dir_special_functionc Cs~||_tjtj|jtj|j}||j|z.t |j|| tj |Wt |n t |0dSr)rvrrr+r,rrupperrNrrerrMrrqrrrtest_move_dir_caseinsensitiveIs  z&TestMove.test_move_dir_caseinsensitiverrr SF_IMMUTABLE UF_OPAQUErc Cs0ztttttj|ttj tt | t t vtttj ttjtdtttj|ttj tt | t t vWtjtrtttj tttjt rtt tj tt nNtjtrtttj tttjt r*tt tj tt 0dS)Nr)rr TESTFN_SRCrrrrr"rre TESTFN_DSTrrLrZ os_helperrr+r,rrxrrrrtest_move_dir_permission_deniedZs,      z(TestMove.test_move_dir_permission_deniedN)+r{r|r}r6rhrirjrkrlrnr&rorprrrsrtrurwrrrr+rxryrzr|rrrrrrrrrrrrrrZrrrrrrrrcsh              rcc@s`eZdZGdddeZddZeedddZ eeddd Z eedd d Z d S) TestCopyFilec@s:eZdZdZdZdZd ddZddZdd Zd d Z dS) zTestCopyFile.FauxFNTcCs||_||_dSr)_raise_in_exit_suppress_at_exit)ryZ raise_in_exitZsuppress_at_exitrrr__init__szTestCopyFile.Faux.__init__cGsdS)Nrr)ryrrrrrHszTestCopyFile.Faux.readcCs d|_dS)NT)_enteredrrrr __enter__szTestCopyFile.Faux.__enter__cCs&|||f|_|jr d|_td|jS)NT Cannot close) _exited_withr_raisedrr)ryexc_typeexc_valexc_tbrrr__exit__s  zTestCopyFile.Faux.__exit__)FT) r{r|r}rrrrrHrrrrrrFauxs rc Csrddd}ttd|F|ttddWdn1sF0YWdn1sd0YdS)NrGcSs|dkrtddsJdS)NsrcfilezCannot open "srcfile"rrlrr@rrr_opensz4TestCopyFile.test_w_source_open_fails.._openr-rdestfile)rG)rrSrrrrryrrrrtest_w_source_open_failss  z%TestCopyFile.test_w_source_open_failszskipped on macOScs|d fdd }ttd|tddWdn1sF0Y|j|jdtu| jdj d dS) NrGcs(|dkr S|dkrtdds$JdS)NrrCannot open "destfile"rrlrrrrrs z2TestCopyFile.test_w_dest_open_fails.._openr-rrrri)r)rG) rrrSrrrrrrrrrrrrtest_w_dest_open_failss* z#TestCopyFile.test_w_dest_open_failscs||dd fdd }ttd|tddWdn1sR0Y|j|j|j|jdt u| jd j d dS) NTrGcs$|dkr S|dkrSds JdSNrrrrrrrrrrs z3TestCopyFile.test_w_dest_close_fails.._openr-rrrri)r)rG) rrrSrrrrrrrrrrrrrtest_w_dest_close_failss *   z$TestCopyFile.test_w_dest_close_failsc s|d|d fdd }ttd|F|ttddWdn1s^0YWdn1s|0Y|j|j| j |j ddu|j dS) NTrGcs$|dkr S|dkrSds JdSrrrrrrrs z5TestCopyFile.test_w_source_close_fails.._openr-rrr)rG) rrrSrrrrrrrrrrrrrtest_w_source_close_failss  H   z&TestCopyFile.test_w_source_close_failsN) r{r|r}objectrrrrrrrrrrrrr}s     rc@sxeZdZdZeddZeddZddZej dd Z d d Z d d Z ddZ ddZeejdkdddZdS)TestCopyFileObji cCstt|jdSr)rErFILESIZEclsrrr setUpClassszTestCopyFileObj.setUpClasscCsttttdSr)rr_rr0rrrr tearDownClasss zTestCopyFileObj.tearDownClasscCsttdSrrr_r0rrrrtearDownszTestCopyFileObj.tearDownc csbttdD}ttd}||fVWdn1s60YWdn1sT0YdSNrFr'r-rr0rrrr get_filess  zTestCopyFileObj.get_filesc Cslt|dN}t|d$}|||Wdn1s@0YWdn1s^0YdSrd)r-rrH)ryrbrcfsrcfdstrrrassert_files_eqs  zTestCopyFileObj.assert_files_eqcCsH| \}}t||Wdn1s.0Y|ttdSr)rr copyfileobjrrr0rrrr test_contents*zTestCopyFileObj.test_contentcCsP|4\}}t|||jr$J|jr.JWdn1sB0YdSr)rrrclosedrrrrtest_file_not_closeds  z$TestCopyFileObj.test_file_not_closedcCs`|D\}}t|||||j|||jWdn1sR0YdSr)rrrrtellrrrrrtest_file_offsets z TestCopyFileObj.test_file_offsetrz Windows onlycCstjd}tttWdn1s.0Y|jsBJ||j dddt j t dd}|dWdn1s0Y|j}|tj|tjd}t|tWdn1s0Y||j dddt j t dd}Wdn1s 0Y|j}|tj|tjd}t|tWdn1sn0Y|jrJ||tdS) Nzshutil._copyfileobj_readintorrYiFrVsfoor)rrGrHrrrr0calledr call_argsr[r\rr]r.rRrwrr_r)rymrDrsrrr test_win_impl s&* (* , zTestCopyFileObj.test_win_implN)r{r|r}r classmethodrrr contextlibcontextmanagerrrrrrrrrrRrrrrrrs   rc@seZdZdZdZdZdZeddZeddZ d d Z e j d d Z d dZddZddZddZddZddZddZddZddZdS) _ZeroCopyFileTestz#Tests common to all zero-copy APIs.ir5rcCsXtt|jttd.}||_t|j|jks6JWdn1sJ0YdSrd)rErrr-rHFILEDATAr)rrDrrrr) s   z_ZeroCopyFileTest.setUpClasscCsttdSr)rr_rrrrrr0 sz_ZeroCopyFileTest.tearDownClasscCsttdSrrrrrrr4 sz_ZeroCopyFileTest.tearDownc csbttdD}ttd}||fVWdn1s60YWdn1sT0YdSrrrrrrr7 s  z_ZeroCopyFileTest.get_filescOs tddS)Nzmust be implemented in subclass)NotImplementedError)ryrrrrr zerocopy_fun= sz_ZeroCopyFileTest.zerocopy_funcCs$||||dSr)rrrr6rrrrreset@ sz_ZeroCopyFileTest.resetc Cs| \}}|||Wdn1s.0Y|ttdd|j|V\}}tjd}t t tWdn1s0Y|j rJWdn1s0YdS)NTr/zshutil.copyfileobj) rrrrIr0rrrGrHrrrr)ryrbrcrrrrtest_regular_copyH s**z#_ZeroCopyFileTest.test_regular_copyc Cs||j|J\}}|t|||Wdn1sF0YWdn1sd0Y|ttdd|j dS)NTr) rwrrrrrrrIrrrrrrtest_same_fileR s   Hz _ZeroCopyFileTest.test_same_filecCsZtjtd}|t}t|dWdn1s<0Y||j j |dS)Nrnew) r[rrr]rrrrrrr)ryrRrrrrtest_non_existent_srcZ s *z'_ZeroCopyFileTest.test_non_existent_srcc stdtd|fdd|fddtdWdn1sT0YtdF}td}|||Wdn1s0YWdn1s0Y|tdd d dS) Nrbrccs tSrrr_r)r`rrrc r5z3_ZeroCopyFileTest.test_empty_file..cs tSrrr)rarrrd r5r'rFTrr5)rrwr-rrrIrr)rar`rtest_empty_file` s   Hz!_ZeroCopyFileTest.test_empty_filecCsHtjj|jtd"|ttjtt Wdn1s:0YdS)Nr#) rrGrH PATCHPOINTZeroDivisionErrorrrrrr0rrrrtest_unhandled_exceptionn s  z*_ZeroCopyFileTest.test_unhandled_exceptionc Cstjj|jttjddr|J\}}|t | ||Wdn1sV0YWdn1st0YWdn1s0YdSNyor) rrGrHrrrEINVALrrr rrrrrtest_exception_on_first_callt s    z._ZeroCopyFileTest.test_exception_on_first_callc Cs|tjj|jttjddN|&\}}|t|j ||Wdn1sP0YWdn1sn0YdSr) rrGrHrrrENOSPCrrrrrrrtest_filesystem_full~ s   z&_ZeroCopyFileTest.test_filesystem_fullN)r{r|r}__doc__rrrrrrrrrrrrrrrrrrrrrrrr# s(     rzos.sendfile() not supportedc@sXeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ dS)TestZeroCopySendfile os.sendfilecCs t||Sr)r_fastcopy_sendfile)ryrrrrrr sz!TestZeroCopySendfile.zerocopy_func Cst|j|}ttdR}|t|||Wdn1sF0Yt ||Wdn1sp0YWdn1s0Y| t tdd|jdS)Nr'Tr) ioBytesIOrr-r0rr rrrrrIrrrrtest_non_regular_file_src s   *Hz.TestZeroCopySendfile.test_non_regular_file_srcc Csttd}tn}|t|||Wdn1sB0Yt||| d| | |j Wdn1s0YWdn1s0YdS)NrFr) r-rrrrr rrrseekrrHrrrrrtest_non_regular_file_dst s   *  z.TestZeroCopySendfile.test_non_regular_file_dstc sfdd}gtjtjjdd|dr|J\}}|t}t ||Wdn1sf0YWdn1s0YWdn1s0YsJ| |j j t j dS)Ncs,sd|i|SttjddS)Nr)rOrrEBADFrr'Z orig_sendfilerrrU s zDTestZeroCopySendfile.test_exception_on_second_call..sendfilerT)rQr#)rrUrrGrHrrrrrrrrr)ryrUrbrcrrrrtest_exception_on_second_call s  fz2TestZeroCopySendfile.test_exception_on_second_callc CstjjdtdR}|*\}}t|||js6JWdn1sJ0YWdn1sh0Y|t t dd|j dS)Nos.fstatrTr) rrGrHrrrrrrrIr0rryrrbrcrrrtest_cant_get_size s  Fz'TestZeroCopySendfile.test_cant_get_sizec Cstj}d|_tjjd|dR}|*\}}t|||jsFJWdn1sZ0YWdn1sx0Y| t t dd|j dS)NirrPTr) rrGMockst_sizerHrrrrrrIr0rryrGrrbrcrrrtest_small_chunks s  Fz&TestZeroCopySendfile.test_small_chunksc Cstj}|jd|_tjjd|dR}|*\}}t|||j sLJWdn1s`0YWdn1s~0Y| t t dd|j dS)Ni@rrTr)rrGrrrrHrrrrrrIr0rrrrrtest_big_chunk s   Fz#TestZeroCopySendfile.test_big_chunkcCstjjdtd}|ttjtt|j dd}| |t j tttttddd|tjtd|ttjttd|j dd}| |d Wdn1s0YdS) NrrrrshelloTr3i)rrGrHrrrrrr0rrrr+r@rr_r1rw)ryr blocksizerrrtest_blocksize_arg s"  z'TestZeroCopySendfile.test_blocksize_argc Cstjs Jztjj|jttjdd|}| J\}}| t t ||Wdn1sb0YWdn1s0Y|j sJWdn1s0YtjrJtj|j&}ttt|j rJWdn1s0YWdt_ndt_0dS)NrrT)r_USE_CP_SENDFILErrGrHrrrENOTSOCKrrr rrrrr0rrrrtest_file2file_not_supported s    H(  *z1TestZeroCopySendfile.test_file2file_not_supportedN) r{r|r}rrrrrrrrrrrrrrr s     rz macOS onlyc@seZdZdZddZdS)TestZeroCopyMACOSzposix._fcopyfilecCst||tjSr)r_fastcopy_fcopyfileposix_COPYFILE_DATArrrrr szTestZeroCopyMACOS.zerocopy_funN)r{r|r}rrrrrrr src@s^eZdZddZddZddZee e j dee edd d d Zd d ZdS)TestGetTerminalSizecCs(t}||jd||jddS)zCheck 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)rget_terminal_sizercolumnslines)ryrArrrtest_does_not_crash sz'TestGetTerminalSize.test_does_not_crashcCst&}d|d<|d=t}Wdn1s40Y||jdt&}|d=d|d<t}Wdn1s0Y||jddS)z.Check if environment variables have precedenceZ777COLUMNSLINESNi Z888ix)rrJrrrrrryrLrArrrtest_os_environ_first s & &z)TestGetTerminalSize.test_os_environ_firstcCs`t(}d|d<d|d<t}Wdn1s60Y||jd||jddS)Nrfr Zyyyr r)rrJrrrrrr rrrtest_bad_environ s  &z$TestGetTerminalSize.test_bad_environz not on ttyrzneed os.get_terminal_size()c Csztddg}Wn$tttjfy>|dYn0t|dt|df}t $}|d=|d=t }Wdn1s0Y| ||dS) zCheck 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. ZsttyrAzstty invocation failedrirr r N)rnrrrqrr"rr/rrrrJrrr)ryrArrLrrrrtest_stty_match( s   &z#TestGetTerminalSize.test_stty_matchc Cst}|d=|d=ttddtjdd}Wdn1sF0Y||jd||jdt t j dJ}ttd|tjd d}Wdn1s0YWdn1s0Y||jd ||jd Wdn1s0YdS) Nr r  __stdout__) )fallbackrrr()(rr) rrJrSrlrrrrrr-rdevnull)ryrLrArDrrr test_fallback@ s * Hz!TestGetTerminalSize.test_fallbackN)r{r|r}rr r rrrisattyrlrr^rZrrrrrrr s   rc@seZdZdZddZdS)PublicAPITestsz>Ensures that the correct values are exposed in the public API.cCsP|ttdgd}ttds,tjdkr6|d|ttjt|dS)N__all__)rrrOr\rrrrerxrr ExecErrorrrrrr rr rrrrrr statvfsrr) rrZrrrRrOrrr)ryZ target_apirrrtest_module_all_attributeW s  z(PublicAPITests.test_module_all_attributeN)r{r|r}rrrrrrrT sr__main__)F)F)OrZ unittest.mockrr[rlrrZos.pathrr$rrnr6r8rrrrrrrrrr r r r r rrr ImportErrorrrZ test.supportrrr0rrrrrrrkrrrrrr&r1rErIrPrfZSUPPORTS_SENDFILErsrtZTestCaser~rrIrrr,rbrcrrrrrrrrrr{mainrrrrs8               [gP< s\Jd v N