o
    ˆ¶¹a„S  ã                   @   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
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% dd lm&Z& dd!lm'Z' e
 (¡ Z)e*ed"e+ƒ ƒZ,e"G d#d$„ d$eƒƒZ-G d%d&„ d&e-ƒZ.e"G d'd(„ d(e-ƒƒZ/e"G d)d*„ d*e-ƒƒZ0G d+d,„ d,e-ƒZ1e% 2ed-¡G d.d/„ d/e-ƒƒZ3G d0d1„ d1eƒZ4e5d2k�r,dd3l6m7Z7 e7e8ƒ dS dS )4z;Tests for net_connections() and Process.connections() APIs.é    N)Úclosing)ÚAF_INET)ÚAF_INET6)Ú
SOCK_DGRAM)ÚSOCK_STREAM)ÚFREEBSD)ÚLINUX)ÚMACOS)ÚNETBSD)ÚOPENBSD)ÚPOSIX)ÚSUNOS)ÚWINDOWS)Úsupports_ipv6)ÚPY3)ÚAF_UNIX)ÚHAS_CONNECTIONS_UNIX)ÚSKIP_SYSCONS)ÚPsutilTestCase)Úbind_socket)Úbind_unix_socket)Úcheck_connection_ntuple)Úcreate_sockets)Úreap_children)Úretry_on_failure)Ú	serialrun)Úskip_on_access_denied)Útcp_socketpair)Úunittest)Úunix_socketpair)Úwait_for_fileÚSOCK_SEQPACKETc                   @   s&   e Zd Zdd„ Zdd„ Zd	dd„ZdS )
ÚConnectionTestCasec                 C   ó,   t ststjdd�}|rJ |ƒ‚d S d S d S ©NÚall©Úkind)r
   r   ÚthisprocÚconnections©ÚselfÚcons© r-   ú?/usr/lib/python3/dist-packages/psutil/tests/test_connections.pyÚsetUp6   s
   ýzConnectionTestCase.setUpc                 C   r#   r$   )r   r
   r(   r)   r*   r-   r-   r.   ÚtearDown<   s
   üzConnectionTestCase.tearDownr%   c                    s`   zt j|d�}W n t jy   trY dS ‚ w ‡ fdd„|D ƒ}| ¡  | ¡  |  ||¡ dS )zœGiven a process PID and its list of connections compare
        those against system-wide connections retrieved via
        psutil.net_connections.
        r&   Nc                    s"   g | ]}|j ˆ kr|d d… ‘qS )Néÿÿÿÿ©Úpid©Ú.0Úcr2   r-   r.   Ú
<listcomp>R   s   " zBConnectionTestCase.compare_procsys_connections.<locals>.<listcomp>)ÚpsutilÚnet_connectionsÚAccessDeniedr	   ÚsortÚassertEqual)r+   r3   Ú	proc_consr'   Úsys_consr-   r2   r.   Úcompare_procsys_connectionsC   s   úz.ConnectionTestCase.compare_procsys_connectionsN)r%   )Ú__name__Ú
__module__Ú__qualname__r/   r0   r?   r-   r-   r-   r.   r"   3   s    r"   c                   @   s0   e Zd Ze ed¡dd„ ƒZdd„ Zdd„ ZdS )	ÚTestBasicOperationsúrequires rootc                 C   sF   t ƒ � tjdd�D ]}t|ƒ q
W d   ƒ d S 1 sw   Y  d S r$   )r   r8   r9   r   ©r+   Úconnr-   r-   r.   Útest_systemZ   s
   
ÿ"ÿzTestBasicOperations.test_systemc                 C   sJ   t ƒ � t ¡ jdd�D ]}t|ƒ qW d   ƒ d S 1 sw   Y  d S r$   )r   r8   ÚProcessr)   r   rE   r-   r-   r.   Útest_process`   s
   
ÿ"ÿz TestBasicOperations.test_processc                 C   s(   | j ttjdd� | j ttjdd� d S )Nz???r&   )ÚassertRaisesÚ
ValueErrorr(   r)   r8   r9   ©r+   r-   r-   r.   Útest_invalid_kinde   s   z%TestBasicOperations.test_invalid_kindN)	r@   rA   rB   r   ÚskipIfr   rG   rI   rM   r-   r-   r-   r.   rC   X   s
    

rC   c                   @   sŒ   e Zd ZdZdd„ Zdd„ Zdd„ Ze e	ƒ  d¡d	d
„ ƒZ
dd„ Ze e	ƒ  d¡dd„ ƒZe e d¡dd„ ƒZe e d¡dd„ ƒZdS )ÚTestUnconnectedSocketsz;Tests sockets which are open but not connected to anything.c                 C   sr   t jdd�}tdd„ |D ƒƒ}tstr|| ¡  S |  t|ƒd¡ |d jdkr5|  || ¡  j| ¡ ¡ |d S )Nr%   r&   c                 S   s   g | ]}|j |f‘qS r-   )Úfdr4   r-   r-   r.   r7   p   s    z=TestUnconnectedSockets.get_conn_from_sock.<locals>.<listcomp>é   r   r1   )	r(   r)   Údictr
   r   Úfilenor<   ÚlenrP   )r+   Úsockr,   Úsmapr-   r-   r.   Úget_conn_from_sockn   s   z)TestUnconnectedSockets.get_conn_from_sockc                 C   sà   |   |¡}t|ƒ |jdkr|  |j| ¡ ¡ |  |j|j¡ |  |j| tj	tj
¡¡ | ¡ }|s=tr=t|tƒr=| ¡ }|jtkrH|dd… }|jtkrPtrPn|  |j|¡ |jtkrntrntjdd�}| jt ¡ |dd� |S )z±Given a socket, makes sure it matches the one obtained
        via psutil. It assumes this process created one connection
        only (the one supposed to be checked).
        r1   Né   r%   r&   )rW   r   rP   r<   rS   ÚfamilyÚtypeÚ
getsockoptÚsocketÚ
SOL_SOCKETÚSO_TYPEÚgetsocknamer   Ú
isinstanceÚbytesÚdecoder   r   r   Úladdrr   r(   r)   r?   ÚosÚgetpid)r+   rU   rF   rc   r,   r-   r-   r.   Úcheck_socket{   s(   

ÿ
z#TestUnconnectedSockets.check_socketc                 C   ó`   d}t ttt|d�ƒ�}|  |¡}|jrJ ‚|  |jtj	¡ W d   ƒ d S 1 s)w   Y  d S ©N©ú	127.0.0.1r   ©Úaddr)
r   r   r   r   rf   Úraddrr<   Ústatusr8   ÚCONN_LISTEN©r+   rl   rU   rF   r-   r-   r.   Útest_tcp_v4ž   ó   

"ýz"TestUnconnectedSockets.test_tcp_v4zIPv6 not supportedc                 C   rg   ©N)ú::1r   rk   )
r   r   r   r   rf   rm   r<   rn   r8   ro   rp   r-   r-   r.   Útest_tcp_v6¥   ó   

"ýz"TestUnconnectedSockets.test_tcp_v6c                 C   rg   rh   )
r   r   r   r   rf   rm   r<   rn   r8   Ú	CONN_NONErp   r-   r-   r.   Útest_udp_v4­   rr   z"TestUnconnectedSockets.test_udp_v4c                 C   rg   rs   )
r   r   r   r   rf   rm   r<   rn   r8   rw   rp   r-   r-   r.   Útest_udp_v6´   rv   z"TestUnconnectedSockets.test_udp_v6ú
POSIX onlyc                 C   ób   |   ¡ }tt|td�ƒ�}|  |¡}|jrJ ‚|  |jtj	¡ W d   ƒ d S 1 s*w   Y  d S ©N)rZ   ©
Ú
get_testfnr   r   r   rf   rm   r<   rn   r8   rw   ©r+   ÚtestfnrU   rF   r-   r-   r.   Útest_unix_tcp¼   ó   

"ýz$TestUnconnectedSockets.test_unix_tcpc                 C   r{   r|   r}   r   r-   r-   r.   Útest_unix_udpÄ   r‚   z$TestUnconnectedSockets.test_unix_udpN)r@   rA   rB   Ú__doc__rW   rf   rq   r   rN   r   ru   rx   ry   r   r�   rƒ   r-   r-   r-   r.   rO   j   s    #


rO   c                   @   s:   e Zd ZdZe ed¡dd„ ƒZe e d¡dd„ ƒZ	dS )	ÚTestConnectedSocketzJTest socket pairs which are are actually connected to
    each other.
    zunreliable on SUONSc                 C   s’   d}t jdd�r
J ‚tt|d�\}}z-t jdd�}|  t|ƒd¡ |  |d jtj¡ |  |d jtj¡ W | 	¡  | 	¡  d S | 	¡  | 	¡  w )Nri   Útcp4r&   rk   rX   r   rQ   )
r(   r)   r   r   r<   rT   rn   r8   ÚCONN_ESTABLISHEDÚclose)r+   rl   ÚserverÚclientr,   r-   r-   r.   Útest_tcpÕ   s   ÿ
zTestConnectedSocket.test_tcprz   c                 C   s’  |   ¡ }t|ƒ\}}zµtjdd�}|d jr|d jrJ ‚|d jr)|d jr)J ‚ts-tr4dd„ |D ƒ}| jt	|ƒd|d� t
sDtsDtre|  |d jd	¡ |  |d jd	¡ |  ||d jpb|d j¡ nEtrƒ|d j|d j|d j|d jfD ]}|  |d	¡ qyn2|  |d jpŽ|d j|¡ |  |d jpœ|d j|¡ W | ¡  | ¡  d S W | ¡  | ¡  d S W | ¡  | ¡  d S | ¡  | ¡  w )
NÚunixr&   r   rQ   c                 S   s   g | ]	}|j d kr|‘qS )z/var/run/log)rm   r4   r-   r-   r.   r7   ô   ó    z1TestConnectedSocket.test_unix.<locals>.<listcomp>rX   ©ÚmsgÚ )r~   r   r(   r)   rc   rm   r
   r   r<   rT   r   r   r   rˆ   )r+   r€   r‰   rŠ   r,   rl   r-   r-   r.   Ú	test_unixé   s>   ÿþóö	ÿ
zTestConnectedSocket.test_unixN)
r@   rA   rB   r„   r   rN   r   r‹   r   r‘   r-   r-   r-   r.   r…   Í   s    

r…   c                   @   s.   e Zd Zdd„ Zeed�dd„ ƒZdd„ ZdS )	ÚTestFiltersc                    s  ‡ fdd„}t ƒ �n |dtttgtttgƒ |dttgttgƒ |dtgttgƒ |dttgtgƒ |dtgtgƒ |dtgtgƒ |d	ttgtgƒ |d
tgtgƒ |dtgtgƒ tro|dtgtttgƒ W d   ƒ d S W d   ƒ d S 1 szw   Y  d S )Nc                    sh   t j| d�D ]}ˆ  |j|¡ ˆ  |j|¡ qts0tj| d�D ]}ˆ  |j|¡ ˆ  |j|¡ qd S d S )Nr&   )r(   r)   ÚassertInrY   rZ   r   r8   r9   )r'   ÚfamiliesÚtypesrF   rL   r-   r.   Úcheck  s   ýz'TestFilters.test_filters.<locals>.checkr%   ÚinetÚinet4Útcpr†   Útcp6ÚudpÚudp4Úudp6rŒ   )r   r   r   r   r   r   r!   r   )r+   r–   r-   rL   r.   Útest_filters  s\   	þþþþþþþþþþã"äzTestFilters.test_filters)Úonly_ifc                    sä  t ƒ  ‡ fdd„}t d¡}t d¡}tj ˆ jt ¡ d�¡}|jt	t
ƒd|d�}|jt	t
ƒd|d�}|jt	tƒd|d�}|jt	tƒd|d�}ˆ  |¡}	tt|d	d
�ƒ}
ˆ  |¡}tt|d	d
�ƒ}tƒ rˆ  |¡}tt|d	d
�ƒ}ˆ  |¡}tt|d	d
�ƒ}nd }d }d }d }t ¡ D ]d}| ¡ }ˆ  t|ƒd¡ |D ]S}|j|	jkr°|||t
t|
dtjdƒ q›|j|jkrÃ|||t
t|dtjdƒ q›|jt|dd ƒkrÙ|||tt|dtjdƒ q›|jt|dd ƒkrî|||tt|dtjdƒ q›q‹d S )Nc                    s¢   d}t |ƒ ˆ  |j|¡ ˆ  |j|¡ ˆ  |j|¡ ˆ  |j|¡ ˆ  |j|¡ |D ]}	| j|	d�}
|	|v r<|
s;J ‚q+|
rBJ |
ƒ‚q+trOˆ  	| j
|g¡ d S d S )N)
r%   r—   r˜   Úinet6r™   r†   rš   r›   rœ   r�   r&   )r   r<   rY   rZ   rc   rm   rn   r)   r   r?   r3   )ÚprocrF   rY   rZ   rc   rm   rn   ÚkindsÚ	all_kindsr'   r,   rL   r-   r.   Ú
check_conn<  s   
ÿz+TestFilters.test_combos.<locals>.check_conna  
            import socket, time
            s = socket.socket({family}, socket.SOCK_STREAM)
            s.bind(('{addr}', 0))
            s.listen(5)
            with open('{testfn}', 'w') as f:
                f.write(str(s.getsockname()[:2]))
            time.sleep(60)
            a  
            import socket, time
            s = socket.socket({family}, socket.SOCK_DGRAM)
            s.bind(('{addr}', 0))
            with open('{testfn}', 'w') as f:
                f.write(str(s.getsockname()[:2]))
            time.sleep(60)
            )Údirrj   )rY   rl   r€   rt   T)ÚdeleterQ   r-   )r%   r—   r˜   r™   r†   )r%   r—   r˜   r›   rœ   r3   )r%   r—   r    r™   rš   )r%   r—   r    r›   r�   )r   ÚtextwrapÚdedentrd   ÚpathÚbasenamer~   ÚgetcwdÚformatÚintr   r   ÚpyrunÚevalr    r   r(   Úchildrenr)   r<   rT   r3   r   r8   ro   r   rw   Úgetattr)r+   r¤   Útcp_templateÚudp_templateÚtestfileÚtcp4_templateÚudp4_templateÚtcp6_templateÚudp6_templateÚ	tcp4_procÚ	tcp4_addrÚ	udp4_procÚ	udp4_addrÚ	tcp6_procÚ	tcp6_addrÚ	udp6_procÚ	udp6_addrÚpr,   rF   r-   rL   r.   Útest_combos8  sr   




ÿ
ÿ
ÿ
ÿ



þþþþ€îýzTestFilters.test_combosc                 C   s
  t ƒ ��v tjdd�}|  t|ƒtƒ rdnd¡ |D ]}|  |jtt	f¡ |  |j
t¡ qtjdd�}|  t|ƒd¡ |  |d jt¡ |  |d j
t¡ tƒ rptjdd�}|  t|ƒd¡ |  |d jt	¡ |  |d j
t¡ tjdd�}|  t|ƒtƒ r€dnd¡ |D ]}|  |jtt	f¡ |  |j
t¡ q…tjd	d�}|  t|ƒd¡ |  |d jt¡ |  |d j
t¡ tƒ rÛtjd
d�}|  t|ƒd¡ |  |d jt	¡ |  |d j
t¡ tjdd�}|  t|ƒtƒ rëdnd¡ |D ]}|  |jtt	f¡ |  |j
ttf¡ qðtƒ �r-tjdd�}|  t|ƒd¡ |D ]}|  |jt	¡ |  |j
ttf¡ �qt�rZt�sbt�sjtjdd�}|  t|ƒd¡ |D ]+}|  |jt¡ |  |j
ttf¡ �qFW d   ƒ d S W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 �s~w   Y  d S )Nr™   r&   rX   rQ   r†   r   rš   r›   rœ   r�   r—   é   r    rŒ   é   )r   r(   r)   r<   rT   r   r“   rY   r   r   rZ   r   r   r   r   r
   r   )r+   r,   rF   r-   r-   r.   Ú
test_count™  sl   
ûÎ2Î2Î5$ËzTestFilters.test_countN)r@   rA   rB   rž   r   r	   rÂ   rÅ   r-   r-   r-   r.   r’     s
    +
`r’   rD   c                   @   s&   e Zd ZdZdd„ Zeƒ dd„ ƒZdS )ÚTestSystemWideConnectionszTests for net_connections().c                    sš   ‡ fdd„}t ƒ �: ddlm} | ¡ D ]&\}}|dkrtsq|\}}t |¡}ˆ  t|ƒtt	|ƒƒ¡ ||||ƒ qW d   ƒ d S 1 sFw   Y  d S )Nc                    sD   | D ]}ˆ j |j||d� |jtkrˆ j |j||d� t|ƒ qd S )NrŽ   )r“   rY   r   rZ   r   )r,   r”   Útypes_rF   rL   r-   r.   r–   Ù  s   

üz0TestSystemWideConnections.test_it.<locals>.checkr   )Ú	conn_tmaprŒ   )
r   Úpsutil._commonrÈ   Úitemsr   r8   r9   r<   rT   Úset)r+   r–   rÈ   r'   Úgroupsr”   rÇ   r,   r-   rL   r.   Útest_itØ  s   
ù"þz!TestSystemWideConnections.test_itc                    sö   t ƒ �}t|ƒ}W d   ƒ n1 sw   Y  g ‰d}g }t|ƒD ]}|  ¡ }| |¡ t d| ¡}|  |¡}ˆ |j¡ q!|D ]}t	|ƒ qA‡fdd„t
jdd�D ƒ}	ˆD ]!‰ |  t‡ fdd„|	D ƒƒ|¡ t
 ˆ ¡}
|  t|
 d¡ƒ|¡ qWd S )Né
   a                  import time, os
                from psutil.tests import create_sockets
                with create_sockets():
                    with open(r'%s', 'w') as f:
                        f.write("hello")
                    time.sleep(60)
                c                    s   g | ]	}|j ˆ v r|‘qS r-   r2   ©r5   Úx)Úpidsr-   r.   r7   
  s    ÿzFTestSystemWideConnections.test_multi_sockets_procs.<locals>.<listcomp>r%   r&   c                    s   g | ]	}|j ˆ kr|‘qS r-   r2   rÏ   r2   r-   r.   r7     r�   )r   rT   Úranger~   Úappendr§   r¨   r®   r3   r    r8   r9   r<   rH   r)   )r+   ÚsocksÚexpectedÚtimesÚfnamesÚiÚfnameÚsrcÚsprocÚsysconsrÁ   r-   )r3   rÑ   r.   Útest_multi_sockets_procsë  s0   
ÿ
ù

ÿ
üz2TestSystemWideConnections.test_multi_sockets_procsN)r@   rA   rB   r„   rÍ   r   rÝ   r-   r-   r-   r.   rÆ   Ô  s
    rÆ   c                   @   s   e Zd Zdd„ ZdS )ÚTestMiscc                 C   s�   g }g }t tƒD ].}| d¡r6tt|ƒ}t|ƒ}| ¡ s J |ƒ‚|  t|¡ |  ||¡ | |¡ | |¡ qtr?tj	 tj
 trFtj d S d S )NÚCONN_)r¥   r8   Ú
startswithr±   ÚstrÚisupperÚassertNotInrÓ   r   Ú	CONN_IDLEÚ
CONN_BOUNDr   ÚCONN_DELETE_TCB)r+   ÚintsÚstrsÚnameÚnumÚstr_r-   r-   r.   Útest_connection_constants  s$   



€
ÿz"TestMisc.test_connection_constantsN)r@   rA   rB   rì   r-   r-   r-   r.   rÞ     s    rÞ   Ú__main__)Úrun_from_name)9r„   rd   r\   r§   Ú
contextlibr   r   r   r   r   r8   r   r   r	   r
   r   r   r   r   rÉ   r   Úpsutil._compatr   Úpsutil.testsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    rH   r(   r±   Úobjectr!   r"   rC   rO   r…   r’   rN   rÆ   rÞ   r@   Úpsutil.tests.runnerrî   Ú__file__r-   r-   r-   r.   Ú<module>   sl   $b= 
J>
þ