U
    ®[Öeå"  ã                   @   s¢   d Z ddlZddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 G dd„ dejƒZG dd„ dejejƒZG d	d
„ d
ejƒZdd„ Zdd„ ZdS )z Common utilities used in testingé    N)Úcontent)Úoptionsc                       s(   e Zd ZdZdd„ Z‡ fdd„Z‡  ZS )ÚDiveDirzaDive into given directory and return back on cleanup.

    :ivar path: The target directory.
    c                 C   s
   || _ d S ©N)Úpath)Úselfr   © r   úP/var/www/html/services/stratfitenv/lib/python3.8/site-packages/pbr/tests/base.pyÚ__init__=   s    zDiveDir.__init__c                    s0   t t| ƒ ¡  |  tjt ¡ ¡ t | j¡ d S r   )Úsuperr   ÚsetUpÚ
addCleanupÚosÚchdirÚgetcwdr   )r   ©Ú	__class__r   r	   r   @   s    zDiveDir.setUp©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   Ú__classcell__r   r   r   r	   r   7   s   r   c                       sD   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zg d	d
fdd„Z‡  ZS )ÚBaseTestCasec              	      s
  t t| ƒ ¡  tj dd¡}zt|ƒ}W n  tk
rH   tdƒ d}Y nX |dkrf|  	t
j|dd¡ tj d¡tjkrœ|  	t
 d¡¡j}|  	t
 d	|¡¡ tj d
¡tjkrÒ|  	t
 d¡¡j}|  	t
 d|¡¡ |  	t
 d¡¡| _|  	t
 ¡ ¡ |  	t
 ¡ ¡ |  	t
 ¡ ¡ |  	t
 dd¡¡ |  	t
 ¡ ¡j| _tj | jd¡| _t tj tj t¡d¡| j¡ |  tj t !¡ ¡ t  | j¡ |  | j"¡ t#| ddƒs|  	t
 d¡¡ tj | jd¡}t$|dƒ}| %¡ }W 5 Q R X | &dd¡}t$|dƒ}| '|¡ W 5 Q R X d S )NZOS_TEST_TIMEOUTé   z=OS_TEST_TIMEOUT set to invalid value defaulting to no timeoutr   T)ZgentleZOS_STDOUT_CAPTUREÚstdoutz
sys.stdoutZOS_STDERR_CAPTUREÚstderrz
sys.stderrÚpbrZPBR_VERSIONz0.0ZtestpackageZpreversionedz	setup.cfgÚrtzversion = 0.1.devÚ Úwt)(r   r   r   r   ÚenvironÚgetÚintÚ
ValueErrorÚprintZ
useFixtureÚfixturesÚTimeoutr   ZTRUE_VALUESZStringStreamÚstreamZMonkeyPatchZ
FakeLoggerZlog_fixtureZTempHomeDirZNestedTempfileZEnvironmentVariableZTempDirr   Útemp_dirÚjoinÚpackage_dirÚshutilÚcopytreeÚdirnameÚ__file__r   r   r   Ú_discard_testpackageÚgetattrÚopenÚreadÚreplaceÚwrite)r   Ztest_timeoutr   r   Úsetup_cfg_pathÚcfgr   r   r   r	   r   H   sL    
ÿÿzBaseTestCase.setUpc                 C   s.   t tjƒD ]}|dks | d¡r
tj|= q
d S )NZpbr_testpackagezpbr_testpackage.)ÚlistÚsysÚmodulesÚ
startswith)r   Úkr   r   r	   r0   {   s
    ÿz!BaseTestCase._discard_testpackagec                 O   s   | j d|f|ŽS )Nr   ©Ú_run_cmd©r   ÚargsÚkwargsr   r   r	   Úrun_pbrƒ   s    zBaseTestCase.run_pbrc                 O   s   | j tjd| f|ŽS )N)zsetup.py)r>   r9   Ú
executabler?   r   r   r	   Ú	run_setup†   s    zBaseTestCase.run_setupTNc                 C   s@   |p| j }t|gt|ƒ |d}|d r<|s<td|d  ƒ‚|S )af  Run a command in the root of the test working copy.

        Runs a command, with the given argument list, in the root of the test
        working copy--returns the stdout and stderr streams and the exit code
        from the subprocess.

        :param cwd: If falsy run within the test package dir, otherwise run
            within the named path.
        )Úcwdé   zCommand failed retcode=%s)r+   r>   r8   Ú	Exception)r   Úcmdr@   Z
allow_failrE   Úresultr   r   r	   r>   ‰   s
    

zBaseTestCase._run_cmd)	r   r   r   r   r0   rB   rD   r>   r   r   r   r   r	   r   F   s
   3r   c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )ÚCapturedSubprocessa)  Run a process and capture its output.

    :attr stdout: The output (a string).
    :attr stderr: The standard error (a string).
    :attr returncode: The return code of the process.

    Note that stdout and stderr are decoded from the bytestrings subprocess
    returns using error=replace.
    c                    sH   t t| ƒ ¡  || _|| _|| _tj| jd< tj| jd< tj| jd< dS )zÞCreate a CapturedSubprocess.

        :param label: A label for the subprocess in the test log. E.g. 'foo'.
        :param *args: The *args to pass to Popen.
        :param **kwargs: The **kwargs to pass to Popen.
        r   Ústdinr   N)r   rJ   r
   Úlabelr@   rA   Ú
subprocessÚPIPE)r   rL   r@   rA   r   r   r	   r
   ¥   s    zCapturedSubprocess.__init__c                    sÎ   t t| ƒ ¡  tj| j| jŽ}| ¡ \}}| dd¡| _	| dd¡| _
|  | jd t | j	¡¡ |  | jd t | j
¡¡ |j| _|jr td| j| j|jf ƒ‚|  t| d¡ |  t| d¡ |  t| d¡ d S )	Nzutf-8r4   z-stdoutz-stderrz0Failed process args=%r, kwargs=%r, returncode=%sÚoutÚerrÚ
returncode)r   rJ   r   rM   ÚPopenr@   rA   ÚcommunicateÚdecoderO   rP   Z	addDetailrL   r   Ztext_contentrQ   ÚAssertionErrorr   Údelattr)r   ÚprocrO   rP   r   r   r	   r   ´   s&      ÿÿzCapturedSubprocess.setUpr   r   r   r   r	   rJ   š   s   
rJ   c                 C   sv   t dd | ¡ ƒ tj| tjtjtj|d}tdd„ | ¡ D ƒƒ}t dƒ t |d ƒ t dƒ t |d	 ƒ ||jf S )
z¾Run the command args in cwd.

    :param args: The command to run e.g. ['git', 'status']
    :param cwd: The directory to run the comamnd in.
    :return: ((stdout, stderr), returncode)
    z
Running %sú )rK   r   r   rE   c                 s   s   | ]}|  d ¡ ¡ V  qdS )Úlatin1N)rT   Ústrip)Ú.0Úsr   r   r	   Ú	<genexpr>Ñ   s     z_run_cmd.<locals>.<genexpr>zSTDOUT:r   zSTDERR:é   )r%   r*   rM   rR   rN   ÚtuplerS   rQ   )r@   rE   ÚpÚstreamsr   r   r	   r>   Æ   s       þr>   c                   C   s@   t dddddgd ƒ t dddddgd ƒ t dddddgd ƒ d S )	NÚgitÚconfigz--globalz
user.emailzexample@example.comz	user.namezOpenStack Developerzuser.signingkeyr=   r   r   r   r	   Ú_config_gitÙ   s    þþÿþrd   )r   r   r,   rM   r9   r&   ZtestresourcesZ	testtoolsr   r   r   ZFixturer   ZTestCaseZResourcedTestCaser   rJ   r>   rd   r   r   r   r	   Ú<module>(   s   T,