a
    Lg,                     @   s   d dl Z d dlZd dlZd dlm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mZmZmZ ejdkr|d dlmZ nd dl
mZ dZeedd	d
ZeedddZG dd ded ZdS )    N)Path)ListDictAnyOptional)   	   )AbstractContextManager)ContextManagerzlocalhost:12345)pathreturnc                 C   s   t j| ot | t jS N)osr   isfileaccessX_OK)r    r   E/home2/Puru_Virtio_Blk/virtio-demo/qemu/tests/qemu-iotests/testenv.pyisxfile%   s    r   )	qemu_progr   c                    s   t j| ddgddt jdj}|d}ztdd |D }W n tyP   Y dS 0 |d	d
d }d| t fdd|D d }|d ur|d	d
d }|S )Nz-machinehelpT)checkZuniversal_newlinesstdout
c                 s   s   | ]}d |v r|V  qdS )z
 (default)Nr   .0mr   r   r   	<genexpr>0       z&get_default_machine.<locals>.<genexpr>     r   z (alias of {})c                 3   s   | ]}|  r|V  qd S r   )endswithr   Z	alias_sufr   r   r   6   r   )
subprocessrunPIPEr   splitnextStopIterationformat)r   ZoutpZmachinesZdefault_machinealiasr   r#   r   get_default_machine)   s    

r,   c                   @   s   e Zd ZdZg dZee eeef dddZeeef dddZ	d	dd
dZ
d	dddZdeeeeeee ee eeeeeed	dddZd	dddZd dddZeeed	dddZded	dddZd	S )TestEnvz
    Manage system environment for running tests

    The following variables are supported/provided. They are represented by
    lower-cased TestEnv attributes.
    )
PYTHONPATHTEST_DIRSOCK_DIRSAMPLE_IMG_DIRZPYTHON	QEMU_PROGQEMU_IMG_PROGQEMU_IO_PROGQEMU_NBD_PROGQSD_PROGZQEMU_OPTIONSQEMU_IMG_OPTIONSZQEMU_IO_OPTIONSZQEMU_IO_OPTIONS_NO_FMTQEMU_NBD_OPTIONSIMGOPTSZIMGFMTZIMGPROTOZAIOMODEZ	CACHEMODEZVALGRIND_QEMUZCACHEMODE_IS_DEFAULTZIMGFMT_GENERICZIMGOPTSSYNTAXZIMGKEYSECRETZQEMU_DEFAULT_MACHINEMALLOC_PERTURB_GDB_OPTIONSZ
PRINT_QEMU)argsr   c              	   C   s   | j r|d t|d ddF}z"|  dkrB|d| j W n tyV   Y n0 W d    n1 sl0    Y  tj	
 }||   |S )Nz-dr   zutf-8)encodingz#!/usr/bin/env python3)debugappendopenreadlinerstripinsertpythonUnicodeDecodeErrorr   environcopyupdateget_env)selfr<   fZos_envr   r   r   prepare_subprocessT   s    
$
zTestEnv.prepare_subprocess)r   c                 C   s4   i }| j D ]$}t| | d }|d ur
|||< q
|S r   )env_variablesgetattrlower)rJ   envvvalr   r   r   rI   c   s    

zTestEnv.get_envNc              	   C   s   t td }tjtd| jt|t	df| _
t	dtjt d| _t | jjddd z*tjd | _d	| _t | jjddd W n& ty   tjd
d| _d| _Y n0 t	dtj| jd| _dS )zInit directory variables:
             PYTHONPATH
             TEST_DIR
             SOCK_DIR
             SAMPLE_IMG_DIR
        z../../../pythonNr.   r/   ZscratchT)parentsexist_okr0   Fzqemu-iotests-)prefixr1   Zsample_images)r   __file__resolver   pathsepjoinfiltersource_iotestsstrgetenvZ
pythonpathr   getcwdtest_dirmkdirrF   sock_dirtmp_sock_dirKeyErrortempfileZmkdtempZsample_img_dir)rJ   Zqemu_srctree_pathr   r   r   init_directoriesl   s,    	


zTestEnv.init_directoriesc                    sN  t j _ttd fdd}t j}d|v r2d}td|d|  _tj	
 js|d}z&tt|}tdd	 |D  _W n$ ty   t d
| d Y n0 td|d _td|d _td|d _td|dd _ j j j j jfD ]:}tj	
|s.t d|  t|st d|  qdS )zInit binary path variables:
             PYTHON (for bash tests)
             QEMU_PROG, QEMU_IMG_PROG, QEMU_IO_PROG, QEMU_NBD_PROG, QSD_PROG
        )namesr   c                     s   t jj jg| R  S r   )r   r   rY   
build_root)rf   rJ   r   r   root   s    z#TestEnv.init_binaries.<locals>.rootZppc64r2   qemu-system-zqemu-system-*c                 s   s   | ]}t |r|V  qd S r   )r   )r   pr   r   r   r      r   z(TestEnv.init_binaries.<locals>.<genexpr>z1Not found any Qemu executable binary by pattern ''r3   zqemu-imgr4   zqemu-ior5   zqemu-nbdr6   zstorage-daemonzqemu-storage-daemonzNo such file: zNot executable: N)sys
executablerD   r\   r   unamemachiner]   r   r   existssortedglobiglobr(   r)   exitZqemu_img_progZqemu_io_progZqemu_nbd_progZqsd_progr   )rJ   ri   ZarchpatternZprogsbr   rh   r   init_binaries   s8    


zTestEnv.init_binariesF)
source_dir	build_dirimgfmtimgprotoaiomode	cachemodeimgoptsmisalignr>   valgrindgdbqprintdry_runr   c                 C   s"  || _ || _|| _|| _|| _|	| _|r.d| _|rNtdt	| _
| j
s`t	| _
ndtjv r`tjd= |
rjd| _|d u rd| _d| _nd| _|| _|| _|| _t| jjj| _|   |rd S |   tdttdd| _d	| _d
}|D ].\}}| jd| r|  jd| 7  _qt| j| _td| _td| _ | j dv}|rPdnd| _!d| j d| j | _"| jr|  j"d7  _"| j"| _#| j dkrd| _$d| _%| jsd| _nd| jvr|  jd7  _nd| _$|  j"d| j  7  _"| j dkr| jsd| _nd| jvr|  jd7  _d S )Nyr;   trueZ	writebackZfalser:   r!      z&-nodefaults -display none -accel qtest))Zarmvirt)Zaarch64r   )ZavrZmega2560)Zm68kr   )Zor1kr   )Zriscv32r   )Zriscv64r   )Zrxzgdbsim-r5f562n8)Zsh4r2d)Zsh4ebr   )ZtricoreZtricore_testboardrj   z
 -machine r7   r8   )bochscloopdmgvvfatz--cache z --aio z --misalignluksZ123456ziter-time=10z
iter-time=z,iter-time=10z -f vmdkzzeroed_grain=onzzeroed_grain=z,zeroed_grain=on)&r{   r|   r}   r   r   r>   Z
print_qemur   r]   DEF_GDB_OPTIONSZgdb_optionsrF   Zvalgrind_qemuZcachemode_is_defaultr~   r[   Zbuild_iotestsr   parentrg   re   rx   r\   randomZ	randrangeZmalloc_perturb_Zqemu_optionsr   r"   r,   Zqemu_default_machineZqemu_img_optionsZqemu_nbd_optionsZimgfmt_genericZqemu_io_optionsZqemu_io_options_no_fmtZimgoptssyntaxZimgkeysecret)rJ   ry   rz   r{   r|   r}   r~   r   r   r>   r   r   r   r   Zmachine_mapsuffixrp   Z
is_genericr   r   r   __init__   sv    


zTestEnv.__init__c                 C   s   | j rt| j d S r   )rb   shutilrmtreera   rh   r   r   r   close  s    zTestEnv.closec                 C   s   | S r   r   rh   r   r   r   	__enter__#  s    zTestEnv.__enter__)exc_type	exc_value	tracebackr   c                 C   s   |    d S r   )r   )rJ   r   r   r   r   r   r   __exit__&  s    zTestEnv.__exit__r   )rU   r   c                 C   sx   d}t t|  }d|v r0d|d  d|d< t }|j d|j d|j d|j	 |d< ||d	< t
|| d S )
Na+  {prefix}QEMU          -- "{QEMU_PROG}" {QEMU_OPTIONS}
{prefix}QEMU_IMG      -- "{QEMU_IMG_PROG}" {QEMU_IMG_OPTIONS}
{prefix}QEMU_IO       -- "{QEMU_IO_PROG}" {QEMU_IO_OPTIONS}
{prefix}QEMU_NBD      -- "{QEMU_NBD_PROG}" {QEMU_NBD_OPTIONS}
{prefix}IMGFMT        -- {IMGFMT}{imgopts}
{prefix}IMGPROTO      -- {IMGPROTO}
{prefix}PLATFORM      -- {platform}
{prefix}TEST_DIR      -- {TEST_DIR}
{prefix}SOCK_DIR      -- {SOCK_DIR}
{prefix}GDB_OPTIONS   -- {GDB_OPTIONS}
{prefix}VALGRIND_QEMU -- {VALGRIND_QEMU}
{prefix}PRINT_QEMU_OUTPUT -- {PRINT_QEMU}
{prefix}r9   z ()r   /r    platformrU   )collectionsdefaultdictr\   rI   r   ro   sysnamerp   nodenamereleaseprint
format_map)rJ   rU   templater<   ur   r   r   	print_env)  s    &zTestEnv.print_env)NNFFFFFF)r   )__name__
__module____qualname____doc__rM   r   r\   r   rL   rI   re   rx   r   boolr   r   r   r   r   r   r   r   r   r   r-   =   s:   	!'        mr-   )r   rm   rd   pathlibr   r   r   r   r$   rs   typingr   r   r   r   version_info
contextlibr	   r
   r   r\   r   r   r,   r-   r   r   r   r   <module>   s    
