
    fT                        d 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 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)ed" e*             Z+d# Z,e$ G d$ d%e             Z- G d& d'e-      Z.e$ G d( d)e-             Z/e$ G d* d+e-             Z0 G d, d-e-      Z1 ejd                  ed.       G d/ d0e-             Z3 G d1 d2e      Z4e5d3k(  rdd4l6m7Z7  e7e8       yy)5z;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)filter_proc_connections)reap_children)retry_on_failure)	serialrun)skip_on_access_denied)tcp_socketpair)unix_socketpair)wait_for_fileSOCK_SEQPACKETc                 l    t        j                         j                  |       }| dv rt        |      S |S )Nkind)allunix)psutilProcessconnectionsr   )r%   conss     ?/usr/lib/python3/dist-packages/psutil/tests/test_connections.pythis_proc_connectionsr-   3   s4    >>''T'2D&t,,K    c                        e Zd Zd Zd ZddZy)ConnectionTestCasec                 <    | j                  t        d      g        y Nr&   r$   assertEqualr-   selfs    r,   setUpzConnectionTestCase.setUp<   s    .E:B?r.   c                 <    | j                  t        d      g        y r2   r3   r5   s    r,   tearDownzConnectionTestCase.tearDown?   s    .E:B?r.   c                 $   	 t        j                  |      }|D cg c]  }|j                  |k(  s|dd  }}|j                          |j                          | j                  ||       y# t         j                  $ r
 t        rY y w xY wc c}w )zGiven a process PID and its list of connections compare
        those against system-wide connections retrieved via
        psutil.net_connections.
        r$   N)r(   net_connectionsAccessDeniedr
   pidsortr4   )r6   r>   	proc_consr%   sys_conscs         r,   compare_procsys_connectionsz.ConnectionTestCase.compare_procsys_connectionsC   s    
	--48H %-=qAcrF==H- "" 	 	 >s   A- BB-B
B
N)r&   )__name__
__module____qualname__r7   r9   rC    r.   r,   r0   r0   :   s    @@.r.   r0   c                   J    e Zd Z ej                  ed      d        Zd Zd Zy)TestBasicOperationsrequires rootc                     t               5  t        j                  d      D ]  }t        |        	 d d d        y # 1 sw Y   y xY wr2   )r   r(   r<   r   r6   conns     r,   test_systemzTestBasicOperations.test_systemY   s?     	...E: .'-.	. 	. 	.s	   '<Ac                 |    t               5  t        d      D ]  }t        |        	 d d d        y # 1 sw Y   y xY wr2   )r   r-   r   rL   s     r,   test_processz TestBasicOperations.test_process_   s9     	.-59 .'-.	. 	. 	.s   2;c                     | j                  t        t        d       | j                  t        t        j                  d       y )Nz???r$   )assertRaises
ValueErrorr-   r(   r<   r5   s    r,   test_invalid_kindz%TestBasicOperations.test_invalid_kindd   s3    *&;%H*f&<&<5Ir.   N)	rD   rE   rF   unittestskipIfr   rN   rP   rT   rG   r.   r,   rI   rI   X   s,    X__\?3. 4.
.
Jr.   rI   c                      e Zd ZdZd Zd Zd Z ej                   e	        d      d        Z
d Z ej                   e	        d      d        Z ej                  e d	      d
        Z ej                  e d	      d        Zy)TestUnconnectedSocketsz;Tests sockets which are open but not connected to anything.c                    t        d      }t        |D cg c]  }|j                  |f c}      }t        st        r||j                            S | j                  t        |      d       |d   j                  dk7  r;| j                  ||j                            j                  |j                                |d   S c c}w )Nr&   r$      r   r;   )r-   dictfdr   r   filenor4   len)r6   sockr+   rB   smaps        r,   get_conn_from_sockz)TestUnconnectedSockets.get_conn_from_sockm   s    $%0-1addAY-.W &&SY*AwzzR  dkkm!4!7!7G7N .s   B>c                    | j                  |      }t        |       |j                  dk7  r*| j                  |j                  |j	                                | j                  |j
                  |j
                         | j                  |j                  |j                  t        j                  t        j                               |j                         }|s&t        r t        |t              r|j                         }|j
                  t         k(  r|dd }| j                  |j"                  |       |j
                  t$        k(  r8t&        r2t)        d      }| j+                  t-        j.                         |d       |S )zGiven 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).
        r;   N   r&   r$   )ra   r   r\   r4   r]   familytype
getsockoptsocket
SOL_SOCKETSO_TYPEgetsocknamer   
isinstancebytesdecoder   laddrr   r   r-   rC   osgetpid)r6   r_   rM   rn   r+   s        r,   check_socketz#TestUnconnectedSockets.check_socketz   s   
 &&t,% 77b=TWWdkkm4dkk2IItv'8'8&..I	

   "E5!9LLNE;;(""1IEU+ ;;'!&:(e4D,,RYY[$U,Kr.   c                    d}t        t        t        t        |            5 }| j	                  |      }| j                  |j                  d       | j                  |j                  t        j                         d d d        y # 1 sw Y   y xY wN	127.0.0.1r   addrrG   )
r   r   r   r   rq   r4   raddrstatusr(   CONN_LISTENr6   rw   r_   rM   s       r,   test_tcp_v4z"TestUnconnectedSockets.test_tcp_v4   sm    [+DAB 	>d$$T*DTZZ,T[[&*<*<=	> 	> 	>   ABBzIPv6 not supportedc                    d}t        t        t        t        |            5 }| j	                  |      }| j                  |j                  d       | j                  |j                  t        j                         d d d        y # 1 sw Y   y xY wN)::1r   rv   rG   )
r   r   r   r   rq   r4   rx   ry   r(   rz   r{   s       r,   test_tcp_v6z"TestUnconnectedSockets.test_tcp_v6   sm    [;TBC 	>t$$T*DTZZ,T[[&*<*<=	> 	> 	>r}   c                    d}t        t        t        t        |            5 }| j	                  |      }| j                  |j                  d       | j                  |j                  t        j                         d d d        y # 1 sw Y   y xY wrs   )
r   r   r   r   rq   r4   rx   ry   r(   	CONN_NONEr{   s       r,   test_udp_v4z"TestUnconnectedSockets.test_udp_v4   sm    [*4@A 	<T$$T*DTZZ,T[[&*:*:;	< 	< 	<r}   c                    d}t        t        t        t        |            5 }| j	                  |      }| j                  |j                  d       | j                  |j                  t        j                         d d d        y # 1 sw Y   y xY wr   )
r   r   r   r   rq   r4   rx   ry   r(   r   r{   s       r,   test_udp_v6z"TestUnconnectedSockets.test_udp_v6   sm    [:DAB 	<d$$T*DTZZ,T[[&*:*:;	< 	< 	<r}   
POSIX onlyc                 0   | j                         }t        t        |t                    5 }| j	                  |      }| j                  |j                  d       | j                  |j                  t        j                         d d d        y # 1 sw Y   y xY wN)re    

get_testfnr   r   r   rq   r4   rx   ry   r(   r   r6   testfnr_   rM   s       r,   test_unix_tcpz$TestUnconnectedSockets.test_unix_tcp   s    "%f;?@ 	<D$$T*DTZZ,T[[&*:*:;	< 	< 	<   ABBc                 0   | j                         }t        t        |t                    5 }| j	                  |      }| j                  |j                  d       | j                  |j                  t        j                         d d d        y # 1 sw Y   y xY wr   r   r   s       r,   test_unix_udpz$TestUnconnectedSockets.test_unix_udp   r   r   N)rD   rE   rF   __doc__ra   rq   r|   rU   rV   r   r   r   r   r   r   r   rG   r.   r,   rX   rX   i   s    E@> X__(*>?> @>< X__(*>?< @< X__Y-< .< X__Y-< .<r.   rX   c                   v    e Zd ZdZ ej
                  ed      d        Z ej
                  e d      d        Z	y)TestConnectedSocketzFTest socket pairs which are actually connected to
    each other.
    zunreliable on SUONSc                    d}| j                  t        d      g        t        t        |      \  }}	 t        d      }| j                  t	        |      d       | j                  |d   j
                  t        j                         | j                  |d   j
                  t        j                         |j                          |j                          y # |j                          |j                          w xY w)Nrt   tcp4r$   rv   rc   r   rZ   )	r4   r-   r   r   r^   ry   r(   CONN_ESTABLISHEDclose)r6   rw   serverclientr+   s        r,   test_tcpzTestConnectedSocket.test_tcp   s    .F;R@'d;	(f5DSY*T!W^^V-D-DET!W^^V-D-DE LLNLLN LLNLLNs   BC "C8r   c                    | j                         }t        |      \  }}	 t        d      }|d   j                  r|d   j                  rJ |       |d   j                  r|d   j                  rJ |       t
        st        r|D cg c]  }|j                  dk7  s| }}| j                  t        |      d|       t        st        st        st        ro| j                  |d   j                  d       | j                  |d   j                  d       | j                  ||d   j                  xs |d   j                         n0| j                  |d   j                  xs |d   j                  |       |j                          |j                          y c c}w # |j                          |j                          w xY w)	Nr'   r$   r   rZ   z/var/run/logrc   msgr   )r   r    r-   rn   rx   r   r   r4   r^   r	   r   r   r   )r6   r   r   r   r+   rB   s         r,   	test_unixzTestConnectedSocket.test_unix   s\   "(0	(f5DQ$q'-->$>8Q$q'-->$>8 $(Ea177n+DEESYt45G  a3  a3  a)G$q'--H   a!?$q'--HLLNLLN F LLNLLNs%   A&F FFCF F "F=N)
rD   rE   rF   r   rU   rV   r   r   r   r   rG   r.   r,   r   r      sL     X__U12 3& X__Y- .r.   r   c                   6    e Zd Zd Z ee      d        Zd Zy)TestFiltersc                 X     fd}t               5   |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        r |dt        gt        t
        t        g       d d d        y # 1 sw Y   y xY w)Nc                 L   t        |       D ]:  }j                  |j                  |       j                  |j                  |       < t        sTt        j                  |       D ]:  }j                  |j                  |       j                  |j                  |       < y y )Nr$   )r-   assertInrd   re   r   r(   r<   )r%   familiestypesrM   r6   s       r,   checkz'TestFilters.test_filters.<locals>.check  s    -48 0dkk84dii/0  "22= 4DMM$++x8MM$))U34  r.   r&   inetinet4tcpr   tcp6udpudp4udp6r'   )r   r   r   r   r   r   r"   r   )r6   r   s   ` r,   test_filterszTestFilters.test_filters  s    	4  	(G,j.9
 &7H-Z/HI'G9{J&?@%'8,{m<&7)k]3&8*{m4%'8,zl;&7)j\2&8*zl3#I *n=	 	 	s   DD  D))only_ifc                     t                 fd}t        j                  d      }t        j                  d      }t        j                  j                   j                  t        j                                     }|j                  t        t              d|      }|j                  t        t              d|      }|j                  t        t              d|      }|j                  t        t              d|      } j                  |      }	t        t        |d	            }
 j                  |      }t        t        |d	            }t               rO j                  |      }t        t        |d	            } j                  |      }t        t        |d	            }nd }d }d }d }t!        j"                         j%                         D ]5  }|j'                         } j)                  t+        |      d
       |D ]  }|j,                  |	j,                  k(  r& |||t        t.        |
dt         j0                  d       C|j,                  |j,                  k(  r& |||t        t2        |dt         j4                  d       |j,                  t7        |dd       k(  r& |||t        t.        |dt         j0                  d       |j,                  t7        |dd       k(  s |||t        t2        |dt         j4                  d        8 y )Nc                    d}t        |       j                  |j                  |       j                  |j                  |       j                  |j                  |       j                  |j
                  |       j                  |j                  |       |D ]=  }	| j                  |	      }
|	|v rj                  |
g        ,j                  |
g        ? t        rj                  | j                  |g       y y )N)
r&   r   r   inet6r   r   r   r   r   r   r$   )r   r4   rd   re   rn   rx   ry   r*   assertNotEqualr   rC   r>   )procrM   rd   re   rn   rx   ry   kinds	all_kindsr%   r+   r6   s              r,   
check_connz+TestFilters.test_combos.<locals>.check_conn%  s    I $D)T[[&1TYY-TZZ/TZZ/T[[&1! /''T'25=''b1$$T2./ $00D6B $r.   a  
            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)
            )dirru   )rd   rw   r   r   T)deleterZ   rG   )r&   r   r   r   r   )r&   r   r   r   r   r>   )r&   r   r   r   r   )r&   r   r   r   r   )r   textwrapdedentro   pathbasenamer   getcwdformatintr   r   pyrunevalr!   r   r(   r)   childrenr*   r4   r^   r>   r   rz   r   r   getattr)r6   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+   rM   s   `                   r,   test_comboszTestFilters.test_combos!  s   	C>   (    (  77##DOO		O$DE$++w<k( , 
 %++w<k( , 
 %++x=uX , 
 %++x=uX , 
 JJ}-	x=>	JJ}-	x=>	?

=1I]8DABI

=1I]8DABIIIII!**, 3	A==?DSY* 055IMM)#!**?	 UUimm+"!((?	 UUgi== #!**?	 UUgi== "!((?	O03	r.   c                    t               5  t        d      }| j                  t        |      t	               rdnd       |D ]H  }| j                  |j                  t        t        f       | j                  |j                  t               J t        d      }| j                  t        |      d       | j                  |d   j                  t               | j                  |d   j                  t               t	               rmt        d      }| j                  t        |      d       | j                  |d   j                  t               | j                  |d   j                  t               t        d      }| j                  t        |      t	               rdnd       |D ]H  }| j                  |j                  t        t        f       | j                  |j                  t               J t        d	      }| j                  t        |      d       | j                  |d   j                  t               | j                  |d   j                  t               t	               rmt        d
      }| j                  t        |      d       | j                  |d   j                  t               | j                  |d   j                  t               t        d      }| j                  t        |      t	               rdnd       |D ]N  }| j                  |j                  t        t        f       | j                  |j                  t        t        f       P t	               rtt        d      }| j                  t        |      d       |D ]H  }| j                  |j                  t               | j                  |j                  t        t        f       J t        rt        szt        stt        d      }| j                  t        |      d       |D ]H  }| j                  |j                  t               | j                  |j                  t        t        f       J d d d        y # 1 sw Y   y xY w)Nr   r$   rc   rZ   r   r   r   r   r   r   r      r   r'      )r   r-   r4   r^   r   r   rd   r   r   re   r   r   r   r   r   r   )r6   r+   rM   s      r,   
test_countzTestFilters.test_count  sK    7	H(e4DSY]_!D 9dkkGX+>?  K89 )f5DSY*T!W^^W5T!W\\;7,&9  TA.  a:  a{;(e4DSY]_!D 8dkkGX+>?  J78 )f5DSY*T!W^^W5T!W\\:6,&9  TA.  a:  az:(f5DSY]_!D DdkkGX+>?dii+z)BCD ,':  TA.  HD$$T[[(;MM$))k:-FGH
 $W,&9  TA.  HD$$T[[':MM$))k:-FGHk7	H 7	H 7	Hs   QQ''Q0N)rD   rE   rF   r   r   r
   r   r   rG   r.   r,   r   r     s)    > 5)H *HT8Hr.   r   rJ   c                   0    e Zd ZdZd Z e       d        Zy)TestSystemWideConnectionszTests for net_connections().c           
      F     fd}t               5  ddlm} |j                         D ]b  \  }}|dk(  rt        s|\  }}t        j                  |      } j                  t        |      t        t        |                    ||||       d 	 d d d        y # 1 sw Y   y xY w)Nc                     | D ]\  }j                  |j                  ||       |j                  t        k7  rj                  |j                  ||       t	        |       ^ y )Nr   )r   rd   r   re   r   )r+   r   types_rM   r6   s       r,   r   z0TestSystemWideConnections.test_it.<locals>.check  sR     .dkk8>;;')MM$))VM>'-	.r.   r   )	conn_tmapr'   )
r   psutil._commonr   itemsr   r(   r<   r4   r^   set)r6   r   r   r%   groupsr   r   r+   s   `       r,   test_itz!TestSystemWideConnections.test_it  s    	.  
	.0 ) 1 .f6>*>#) &--d3  TCD	N;dHf-.
	. 
	. 
	.s   A<BB c           
         t               5 }t        |      }d d d        g }d}g }t        |      D ]g  }| j                         }|j	                  |       t        j                  d|z        }| j                  |      }	|j	                  |	j                         i |D ]  }t        |        t        j                  d      D 
cg c]  }
|
j                  |v s|
 }}
|D ]z  }| j                  t        |D 
cg c]  }
|
j                  |k(  s|
 c}
             t        j                  |      }| j                  t        |j                  d            |       | y # 1 sw Y   IxY wc c}
w c c}
w )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)
                r&   r$   )r   r^   ranger   appendr   r   r   r>   r!   r(   r<   r4   r)   r*   )r6   socksexpectedpidstimesfnames_fnamesrcsprocxsysconsr>   r   s                 r,   test_multi_sockets_procsz2TestSystemWideConnections.test_multi_sockets_procs  sa     	"5zH	"u 	#AOO%EMM% // # # C JJsOEKK		"	#  	!E% 	! --59
QUUd]A
 
  	BC81155C<Q898 s#ASu!56A	B5	" 	".

 9s#   EE+E+7E0E0E(N)rD   rE   rF   r   r   r   r   rG   r.   r,   r   r     s#    &.( &B &Br.   r   c                       e Zd Zd Zy)TestMiscc                    g }g }t        t              D ]  }|j                  d      st        t        |      }t	        |      }|j                         sJ |       | j                  t        |       | j                  ||       |j                  |       |j                  |        t        r t        j                   t        j                   t        rt        j                   y y )NCONN_)r   r(   
startswithr   strisupperassertNotInr   r   	CONN_IDLE
CONN_BOUNDr   CONN_DELETE_TCB)r6   intsstrsnamenumstr_s         r,   test_connection_constantsz"TestMisc.test_connection_constants*  s    K 	"Dw'fd+3x||~+t+~  d+  d+C D!	" "" r.   N)rD   rE   rF   r  rG   r.   r,   r   r   )  s    #r.   r   __main__)run_from_name)9r   ro   rg   r   rU   
contextlibr   r   r   r   r   r(   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!   r   objectr"   r-   r0   rI   rX   r   r   rV   r   r   rD   psutil.tests.runnerr
  __file__rG   r.   r,   <module>r     s[   B 	                  (    - % ' $ ) 0 ' 0 & ) " . ' ( & !168< . . .:J, J" \</ \< \<~ 4, 4 4ncH$ cHL />B 2 >B 0>BB#~ #( z1( r.   