U
    ;g!1                     @   s  d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	lm
Z
 dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ G dd deZG dd deZG dd  d eZ G d!d" d"eZ!G d#d$ d$eZ"dS )%zContracts tests. These tests mainly check API sanity in terms of
returned types and APIs availability.
Some of these are duplicates of tests test_system.py and test_process.py.
    N)AIX)FREEBSD)LINUX)MACOS)NETBSD)OPENBSD)POSIX)SUNOS)WINDOWS)long)GITHUB_ACTIONS)HAS_CPU_FREQ)HAS_NET_IO_COUNTERS)HAS_SENSORS_FANS)HAS_SENSORS_TEMPERATURES)PYPY)	QEMU_USER)SKIP_SYSCONS)PsutilTestCase)create_sockets)enum)is_namedtuple)kernel_version)pytestc                   @   sH   e Zd Zdd Zdd Zdd Zdd Zejj	e
o4ed	d
dd ZdS )TestAvailConstantsAPIsc                 C   s   t tdtptptkstd S )NZPROCFS_PATH)hasattrpsutilr   r	   r   AssertionErrorself r    ?/tmp/pip-unpacked-wheel-u0epr1ex/psutil/tests/test_contracts.pytest_PROCFS_PATH3   s    z'TestAvailConstantsAPIs.test_PROCFS_PATHc                 C   sj   | j }|ttdt |ttdt |ttdt |ttdt |ttdt |ttdt d S )NZABOVE_NORMAL_PRIORITY_CLASSZBELOW_NORMAL_PRIORITY_CLASSZHIGH_PRIORITY_CLASSZIDLE_PRIORITY_CLASSZNORMAL_PRIORITY_CLASSZREALTIME_PRIORITY_CLASSassertEqualr   r   r
   r   Zaer    r    r!   test_win_priority6   s    z(TestAvailConstantsAPIs.test_win_priorityc                 C   sJ   | j }|ttdt |ttdt |ttdt |ttdt d S )NZIOPRIO_CLASS_NONEZIOPRIO_CLASS_RTZIOPRIO_CLASS_BEZIOPRIO_CLASS_IDLE)r$   r   r   r   r%   r    r    r!   test_linux_ioprio_linux?   s
    z.TestAvailConstantsAPIs.test_linux_ioprio_linuxc                 C   sJ   | j }|ttdt |ttdt |ttdt |ttdt d S )NZIOPRIO_HIGHZIOPRIO_NORMALZ
IOPRIO_LOWZIOPRIO_VERYLOWr#   r%   r    r    r!   test_linux_ioprio_windowsF   s
    z0TestAvailConstantsAPIs.test_linux_ioprio_windows%unsupported on GITHUB_ACTIONS + LINUXreasonc                 C   s  | j }|ttdtpt |ttdtp*t |ttdtp>t |ttdtpRt |ttdtpft |ttdtpzt |ttdtpt |ttdtpt |ttd	tpt |ttd
tpt |ttdtpt |ttdt trt dkr|ttdt t dkr0|ttdt t dkrL|ttdt t dkrh|ttdt t dkr|ttdt |ttdt |ttdt |ttdt d S )NZRLIM_INFINITYZ	RLIMIT_ASZRLIMIT_COREZ
RLIMIT_CPUZRLIMIT_DATAZRLIMIT_FSIZEZRLIMIT_MEMLOCKZRLIMIT_NOFILEZRLIMIT_NPROCZ
RLIMIT_RSSZRLIMIT_STACKZRLIMIT_LOCKS)         ZRLIMIT_MSGQUEUE)r,   r-      ZRLIMIT_NICEZRLIMIT_RTPRIO)r,   r-      ZRLIMIT_RTTIMEZRLIMIT_SIGPENDINGZRLIMIT_SWAPZRLIMIT_SBSIZEZRLIMIT_NPTS)r$   r   r   r   r   r   r   r%   r    r    r!   test_rlimitM   s6    z"TestAvailConstantsAPIs.test_rlimitN)__name__
__module____qualname__r"   r&   r'   r(   r   markskipifr   r   r1   r    r    r    r!   r   2   s   	r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestAvailSystemAPIsc                 C   s   t tdtkstd S )NZwin_service_iterr   r   r
   r   r   r    r    r!   test_win_service_iterr   s    z)TestAvailSystemAPIs.test_win_service_iterc                 C   s   t tdtkstd S )NZwin_service_getr8   r   r    r    r!   test_win_service_getu   s    z(TestAvailSystemAPIs.test_win_service_getc                 C   s&   t tdtptptptptks"td S )Ncpu_freq)r   r   r   r   r
   r   r   r   r   r    r    r!   test_cpu_freqx   s    z!TestAvailSystemAPIs.test_cpu_freqc                 C   s   t tdtptkstd S )Nsensors_temperatures)r   r   r   r   r   r   r    r    r!   test_sensors_temperatures}   s    z-TestAvailSystemAPIs.test_sensors_temperaturesc                 C   s   t tdtkstd S )Nsensors_fans)r   r   r   r   r   r    r    r!   test_sensors_fans   s    z%TestAvailSystemAPIs.test_sensors_fansc                 C   s"   t tdtptptptkstd S )NZsensors_battery)r   r   r   r
   r   r   r   r   r    r    r!   test_battery   s    z TestAvailSystemAPIs.test_batteryN)	r2   r3   r4   r9   r:   r<   r>   r@   rA   r    r    r    r!   r7   q   s   r7   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zej	j
eo<edddd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )TestAvailProcessAPIsc                 C   s4   t tjdtp(tp(tp(tp(tp(tp(t	p(t
ks0td S )Nenviron)r   r   Processr   r   r
   r   r	   r   r   r   r   r   r    r    r!   test_environ   s     
z!TestAvailProcessAPIs.test_environc                 C   s   t tjdtkstd S NZuidsr   r   rD   r   r   r   r    r    r!   	test_uids   s    zTestAvailProcessAPIs.test_uidsc                 C   s   t tjdtkstd S rF   rG   r   r    r    r!   	test_gids   s    zTestAvailProcessAPIs.test_gidsc                 C   s   t tjdtkstd S )NterminalrG   r   r    r    r!   test_terminal   s    z"TestAvailProcessAPIs.test_terminalc                 C   s   t tjdtptkstd S )NZionice)r   r   rD   r   r
   r   r   r    r    r!   test_ionice   s    z TestAvailProcessAPIs.test_ionicer)   r*   c                 C   s   t tjdtptkstd S )NZrlimit)r   r   rD   r   r   r   r   r    r    r!   r1      s    z TestAvailProcessAPIs.test_rlimitc                 C   s"   t tjd}|tpt kstd S )NZio_counters)r   r   rD   r   r	   r   r   Zhasitr    r    r!   test_io_counters   s    z%TestAvailProcessAPIs.test_io_countersc                 C   s   t tjdtkstd S )NZnum_fdsrG   r   r    r    r!   test_num_fds   s    z!TestAvailProcessAPIs.test_num_fdsc                 C   s   t tjdtkstd S )NZnum_handles)r   r   rD   r
   r   r   r    r    r!   test_num_handles   s    z%TestAvailProcessAPIs.test_num_handlesc                 C   s    t tjdtptptkstd S )NZcpu_affinity)r   r   rD   r   r
   r   r   r   r    r    r!   test_cpu_affinity   s    

z&TestAvailProcessAPIs.test_cpu_affinityc                 C   s    t tjdtptptkstd S )NZcpu_num)r   r   rD   r   r   r	   r   r   r    r    r!   test_cpu_num   s    

z!TestAvailProcessAPIs.test_cpu_numc                 C   s*   t tjd}|tptptpt ks&td S )NZmemory_maps)r   r   rD   r   r   r   r   r   rM   r    r    r!   test_memory_maps   s    z%TestAvailProcessAPIs.test_memory_mapsN)r2   r3   r4   rE   rH   rI   rK   rL   r   r5   r6   r   r   r1   rN   rO   rP   rQ   rR   rS   r    r    r    r!   rB      s    
rB   c                   @   s&  e Zd ZdZedd ZedfddZdd Zd	d
 Z	dd Z
dd ZejjeoZe dkddejje dddd Zdd Zdd Zejjedddd Zdd Zejjedddd  Zejje ddd!d" Zejje ddd#d$ Zejje ddd%d& Z d'd( Z!d)d* Z"d+S ),TestSystemAPITypeszCheck the return types of system related APIs.
    Mainly we want to test we never return unicode on Python 2, see:
    https://github.com/giampaolo/psutil/issues/1039.
    c                 C   s   t  | _d S N)r   rD   proc)clsr    r    r!   
setUpClass   s    zTestSystemAPITypes.setUpClassTc                 C   s8   t |st|D ]"}t||s"t|r|dkstqd S )Nr   )r   r   
isinstance)r   nttype_Zgezeronr    r    r!   assert_ntuple_of_nums   s
    z(TestSystemAPITypes.assert_ntuple_of_numsc                 C   s.   |  t  tjddD ]}|  | qd S )NT)Zpercpu)r]   r   Z	cpu_times)r   rZ   r    r    r!   test_cpu_times   s    z!TestSystemAPITypes.test_cpu_timesc                 C   s0   t tjd dtstt tjddts,td S )Nintervalgh㈵>)rY   r   Zcpu_percentfloatr   r   r    r    r!   test_cpu_percent   s    z#TestSystemAPITypes.test_cpu_percentc                 C   s(   |  tjd d |  tjdd d S )Nr_   g-C6?)r]   r   Zcpu_times_percentr   r    r    r!   test_cpu_times_percent   s    z)TestSystemAPITypes.test_cpu_times_percentc                 C   s   t t tstd S rU   )rY   r   	cpu_countintr   r   r    r    r!   test_cpu_count   s    z!TestSystemAPITypes.test_cpu_countZarm64zskipped due to #1892r*   znot supportedc                 C   s2   t  d krtd| jt  tttfd d S )Nzcpu_freq() returns Noner[   )r   r;   r   skipr]   ra   re   r   r   r    r    r!   r<      s    
z TestSystemAPITypes.test_cpu_freqc                 C   s>   t jdd D ](\}}t|ts&t| j|ttfd qd S )NT)Zperdiskrg   )	r   Zdisk_io_countersitemsrY   strr   r]   re   r   )r   kvr    r    r!   test_disk_io_counters   s    z(TestSystemAPITypes.test_disk_io_countersc                 C   sR   t  D ]D}t|jtstt|jts,tt|jts<tt|jtstqd S rU   )	r   Zdisk_partitionsrY   Zdevicerj   r   Z
mountpointZfstypeopts)r   Zdiskr    r    r!   test_disk_partitions   s
    z'TestSystemAPITypes.test_disk_partitionszrequires rootc              	   C   sN   t  > td}t|tt|ks*t|D ]}t|s.tq.W 5 Q R X d S )Nall)r   r   Znet_connectionslensetr   r   )r   retconnr    r    r!   test_net_connections   s
    
z'TestSystemAPITypes.test_net_connectionsc                 C   s   t   D ]\}}t|ts"t|D ]t}td k	rJtsJt|jtj	sZtnt|jt
sZtt|jtsjtt|jttd fstt|jttd fs&tq&qd S rU   )r   Znet_if_addrsri   rY   rj   r   r   r   familyIntEnumre   addressnetmasktype	broadcast)r   ifnameaddrsaddrr    r    r!   test_net_if_addrs  s    z$TestSystemAPITypes.test_net_if_addrszQEMU user not supportedc                 C   s   t   D ]r\}}t|ts"tt|jts2ttd k	rNt|j	tj
s^tnt|j	ts^tt|jtsntt|jtstqd S rU   )r   Znet_if_statsri   rY   rj   r   Zisupboolr   Zduplexrw   re   speedmtu)r   r|   infor    r    r!   test_net_if_stats  s    z$TestSystemAPITypes.test_net_if_statsc                 C   s$   t jddD ]}t|tstqd S )NT)Zpernic)r   Znet_io_countersrY   rj   r   )r   r|   r    r    r!   test_net_io_counters"  s    z'TestSystemAPITypes.test_net_io_countersc                 C   s\   t   D ]J\}}t|ts"t|D ].}t|jts:tt|jtt	t
d fs&tq&qd S rU   )r   r?   ri   rY   rj   r   labelcurrentra   re   rz   r   nameZunitsunitr    r    r!   r@   (  s
    z$TestSystemAPITypes.test_sensors_fansc                 C   s   t   D ]~\}}t|ts"t|D ]b}t|jts:tt|jtt	t
d fsTtt|jtt	t
d fsntt|jtt	t
d fs&tq&qd S rU   )r   r=   ri   rY   rj   r   r   r   ra   re   rz   highcriticalr   r    r    r!   r>   1  s    z,TestSystemAPITypes.test_sensors_temperaturesc                 C   s   t t tstd S rU   )rY   r   Z	boot_timera   r   r   r    r    r!   test_boot_time<  s    z!TestSystemAPITypes.test_boot_timec                 C   sj   t  D ]\}t|jtstt|jttd fs4tt|jttd fsLtt|j	t
td fstqd S rU   )r   ZusersrY   r   rj   r   rJ   rz   hostpidre   )r   userr    r    r!   
test_users@  s
    zTestSystemAPITypes.test_usersN)#r2   r3   r4   __doc__classmethodrX   ra   r]   r^   rb   rc   rf   r   r5   r6   r   platformmachiner   r<   rm   ro   r   ru   r   r   r   r   r   r   r@   r   r>   r   r   r    r    r    r!   rT      s:   
 





rT   c                   @   s&   e Zd Zejje dddd ZdS )TestProcessWaitTypez	not POSIXr*   c                 C   s\   t |  j}|  | }|tj ks0tt	d k	rJt
|t	jsXtnt
|tsXtd S rU   )r   rD   Zspawn_testprocr   	terminatewaitsignalSIGTERMr   r   rY   rw   re   )r   pcoder    r    r!   test_negative_signalJ  s    z(TestProcessWaitType.test_negative_signalN)r2   r3   r4   r   r5   r6   r   r   r    r    r    r!   r   I  s   r   )#r   r   r   r   r   r   r   r   r   r   r   r	   r
   Zpsutil._compatr   Zpsutil.testsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   rB   rT   r   r    r    r    r!   <module>   sB   ?> 