a
    6Rh                     @   sL   d Z ddlZddlZddlZddlZddlZG dd dZG dd dZdS )zdevelop tests    Nc                   @   s0   e Zd Zdd Zedd Zdd Zdd Zd	S )
TestSandboxc                 C   s@   t jt| | tj W d    n1 s20    Y  d S N)
setuptoolssandboxDirectorySandboxstr_file_writerosdevnull)selftmpdir r   S/opt/python-3.9.24/usr/lib/python3.9/site-packages/setuptools/tests/test_sandbox.pytest_devnull   s    zTestSandbox.test_devnullc                    s    fdd}|S )Nc                     s<   t  ddd} | d W d    n1 s.0    Y  d S )Nwutf-8encodingZxxx)openwrite)fpathr   r   do_write   s    z*TestSandbox._file_writer.<locals>.do_writer   )r   r   r   r   r   r      s    zTestSandbox._file_writerc                 C   s:   t td}td}tj|t| |j	dks6J dS )zT
        It should be possible to execute a setup.py with a Byte Order Mark
        zscript-with-bom.py	namespaceZpassedN)
pkg_resourcesresource_filename__name__types
ModuleTyper   r   	_execfilevarsresult)r   targetr   r   r   r   test_setup_py_with_BOM   s    
z"TestSandbox.test_setup_py_with_BOMc                 C   sT   |d }| d}|d W d    n1 s20    Y  tjt|t  d S )Nzsetup.pywbs   "degenerate script"
)r   r   r   r   r    r   globals)r   r   setup_pystreamr   r   r   test_setup_py_with_CRLF"   s    (z#TestSandbox.test_setup_py_with_CRLFN)r   
__module____qualname__r   staticmethodr   r$   r)   r   r   r   r   r      s
   
	r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )TestExceptionSaverc                 C   s6   t j  tdW d    n1 s(0    Y  d S Ndetails)r   r   ExceptionSaver
ValueErrorr   r   r   r   test_exception_trapped*   s    z)TestExceptionSaver.test_exception_trappedc                 C   s   t j }tdW d    n1 s(0    Y  tt}|  W d    n1 sZ0    Y  t|jtstJ t	|jdksJ d S r.   )
r   r   r0   r1   pytestraisesresume
isinstancevaluer   )r   	saved_exccaughtr   r   r   test_exception_resumed.   s    &&z)TestExceptionSaver.test_exception_resumedc                 C   s   t d}tj }|W d    n1 s,0    Y  tt }|  W d    n1 s^0    Y  t|jt sxJ |j|usJ d S r.   )	r1   r   r   r0   r4   r5   r6   r7   r8   )r   Zorig_excr9   r:   r   r   r   test_exception_reconstructed8   s    "&z/TestExceptionSaver.test_exception_reconstructedc                 C   s6   t j }W d    n1 s 0    Y  |  d S r   )r   r   r0   r6   )r   r9   r   r   r    test_no_exception_passes_quietlyD   s    z3TestExceptionSaver.test_no_exception_passes_quietlyc                 C   s   G dd dt }tj }|dW d    n1 s80    Y  ttjj}|  W d    n1 sn0    Y  t|j	dksJ d S )Nc                   @   s   e Zd ZdZedddZdS )zFTestExceptionSaver.test_unpickleable_exception.<locals>.CantPickleThisz:This Exception is unpickleable because it's not in globals)returnc                 S   s   d| j S )NCantPickleThis)argsr2   r   r   r   __repr__N   s    zOTestExceptionSaver.test_unpickleable_exception.<locals>.CantPickleThis.__repr__N)r   r*   r+   __doc__r   rA   r   r   r   r   r?   K   s   r?   detailzCantPickleThis('detail',))
	Exceptionr   r   r0   r4   r5   UnpickleableExceptionr6   r   r8   )r   r?   r9   r:   r   r   r   test_unpickleable_exceptionJ   s    &&z.TestExceptionSaver.test_unpickleable_exceptionc              	   C   s   G dd dt }ttjjH}tj  tj  |W d   n1 sN0    Y  W d   n1 sl0    Y  |jj	\}|dksJ dS )z
        As revealed in #440, an infinite recursion can occur if an unpickleable
        exception while setuptools is hidden. Ensure this doesn't happen.
        c                   @   s   e Zd ZdZdS )zaTestExceptionSaver.test_unpickleable_exception_when_hiding_setuptools.<locals>.ExceptionUnderTestzE
            An unpickleable exception (not in globals).
            N)r   r*   r+   rB   r   r   r   r   ExceptionUnderTest_   s   rG   NzExceptionUnderTest())
rD   r4   r5   r   r   rE   save_moduleshide_setuptoolsr8   r@   )r   rG   r:   msgr   r   r   2test_unpickleable_exception_when_hiding_setuptoolsY   s    
@
zETestExceptionSaver.test_unpickleable_exception_when_hiding_setuptoolsc              
   C   s
  dd }t tjjz}tj P tj  tjt| |  W d   n1 sZ0    Y  W d   n1 sx0    Y  W d   n1 s0    Y  |j	j
\}}}|dksJ |dksJ |ddiksJ t|j	}d|v sJ d|v sJ d	|v sJ dS )
z
        When in a sandbox with setuptools hidden, a SandboxViolation
        should reflect a proper exception and not be wrapped in
        an UnpickleableException.
        c                   S   s2   t dddd W d   n1 s$0    Y  dS )z9Trigger a SandboxViolation by writing outside the sandbox/etc/foor   r   r   N)r   r   r   r   r   
write_files   s    zVTestExceptionSaver.test_sandbox_violation_raised_hiding_setuptools.<locals>.write_fileNr   )rL   r   r   r   z('/etc/foo', 'w')z{'encoding': 'utf-8'})r4   r5   r   r   ZSandboxViolationrH   rI   r   r   r8   r@   )r   r   rM   r:   cmdr@   kwargsrJ   r   r   r   /test_sandbox_violation_raised_hiding_setuptoolsl   s    
`
zBTestExceptionSaver.test_sandbox_violation_raised_hiding_setuptoolsN)
r   r*   r+   r3   r;   r<   r=   rF   rK   rP   r   r   r   r   r-   )   s   
r-   )	rB   r	   r   r4   r   Zsetuptools.sandboxr   r   r-   r   r   r   r   <module>   s   