U
    jPŒ^§"  ã                   @   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   ú0/usr/lib/python3/dist-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.cfgZrtzversion = 0.1.devÚ Zwt)(r   r   r   r   ÚenvironÚgetÚintÚ
ValueErrorÚprintZ
useFixtureÚfixturesZTimeoutr   ZTRUE_VALUESZStringStreamÚstreamZMonkeyPatchZ
FakeLoggerZlog_fixtureZTempHomeDirZNestedTempfileZEnvironmentVariableZTempDirr   Ztemp_dirÚjoinÚpackage_dirÚshutilZcopytreeÚdirnameÚ__file__r   r   r   Ú_discard_testpackageÚgetattrÚopenÚreadÚreplaceÚwrite)r   Ztest_timeoutr   r   Zsetup_cfg_pathZ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	   r+   {   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)r7   r2   Ú
executabler8   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'   r7   r1   Ú	Exception)r   Úcmdr9   Z
allow_failr>   Úresultr   r   r	   r7   ‰   s
    

zBaseTestCase._run_cmd)	r   r   r   r   r+   r;   r=   r7   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   rC   r
   Úlabelr9   r:   Ú
subprocessÚPIPE)r   rE   r9   r:   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-8r/   z-stdoutz-stderrz0Failed process args=%r, kwargs=%r, returncode=%sÚoutÚerrÚ
returncode)r   rC   r   rF   ÚPopenr9   r:   ÚcommunicateÚdecoderH   rI   Z	addDetailrE   r   Ztext_contentrJ   ÚAssertionErrorr   Údelattr)r   ÚprocrH   rI   r   r   r	   r   ´   s&      ÿÿzCapturedSubprocess.setUpr   r   r   r   r	   rC   š   s   
rC   c                 C   sN   t j| t jt jt j|d}tdd„ | ¡ D ƒƒ}|D ]}t|ƒ q4||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)
    )rD   r   r   r>   c                 s   s   | ]}|  d ¡ ¡ V  qdS )Úlatin1N)rM   Ústrip)Ú.0Úsr   r   r	   Ú	<genexpr>Ð   s     z_run_cmd.<locals>.<genexpr>)rF   rK   rG   ÚtuplerL   r#   rJ   )r9   r>   ÚpZstreamsZstream_contentr   r   r	   r7   Æ   s       þ
r7   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 )	NZgitZconfigz--globalz
user.emailzexample@example.comz	user.namezOpenStack Developerzuser.signingkeyr6   r   r   r   r	   Ú_config_gitÖ   s    þþÿþrX   )r   r   r(   rF   r2   r$   ZtestresourcesZ	testtoolsr   r   r   ZFixturer   ZTestCaseZResourcedTestCaser   rC   r7   rX   r   r   r   r	   Ú<module>(   s   T,