3 JZP@s8dZddlZddlZddlZddlmZddlmZddlmZddlmZddlm Z ddl Z ddl m Z dd l m Z dd l m Z dd l mZdd l mZdd l mZddl mZddl mZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%dd lm&Z&dd!lm'Z'dd"lm(Z(dd#lm)Z)dd$lm*Z*e j+Z,Gd%d&d&e-Z.Gd'd(d(e.e'j/Z0Gd)d*d*e.e'j/Z1Gd+d,d,e.e'j/Z2Gd-d.d.e'j/Z3e4d/kr4e!e5dS)0z;Tests for net_connections() and Process.connections() APIs.N)closing)AF_INET)AF_INET6) SOCK_DGRAM) SOCK_STREAM)FREEBSD)LINUX)NETBSD)OPENBSD)OSX)POSIX)SUNOS)WINDOWS) supports_ipv6)PY3)AF_UNIX) bind_socket)bind_unix_socket)check_connection_ntuple)create_sockets) get_free_port)HAS_CONNECTIONS_UNIX)pyrun) reap_children)run_test_module_by_name) safe_rmpath)skip_on_access_denied)tcp_socketpair)TESTFN)TRAVIS)unittest)unix_socket_path)unix_socketpair) wait_for_filec@s8eZdZddZddZddZd dd Zdd d ZdS)BasecCststjdd}dS)Nall)kind)r thisproc connections)selfconsr+(/usr/lib64/python3.6/test_connections.pysetUp6s z Base.setUpcCs"ttttstjdd}dS)Nr%)r&)rrrr r'r()r)r*r+r+r,tearDown<s  z Base.tearDowncCsrtjdd}tdd|D}tr.||jS|jt|d|djdkrf|j||jj|j|dSdS)Nr%)r&cSsg|]}|j|fqSr+)fd).0cr+r+r, Gsz+Base.get_conn_from_sock..r)r'r(dictr fileno assertEquallenr/)r)sockr*Zsmapr+r+r,get_conn_from_sockEs  zBase.get_conn_from_sockNcCs|dkr|j|}t||jdkr6|j|j|j|j|j|j|j|j|jtj tj |j }| rt rt |tr|j}|jtkr|dd}|jtkrtrn|j|j||jtkrtrtjdd}|jtj||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). Nr3r%)r&r4)r:rr/r7r6familytypeZ getsockoptsocketZ SOL_SOCKETZSO_TYPEZ getsocknamer isinstancebytesdecoderrr laddrrr'r(compare_procsys_connectionsosgetpid)r)r9connrBr*r+r+r, check_socketRs(     zBase.check_socketr%c sdytj|d}Wn tjk r0tr*dSYnXfdd|D}|j|j|j||dS)zGiven a process PID and its list of connections compare those against system-wide connections retrieved via psutil.net_connections. )r&Ncs"g|]}|jkr|ddqS)Nr3r4)pid)r0r1)rHr+r,r2sz4Base.compare_procsys_connections..)psutilnet_connectionsZ AccessDeniedr sortr7)r)rHZ proc_consr&Zsys_consr+)rHr,rCvsz Base.compare_procsys_connections)N)r%)__name__ __module__ __qualname__r-r.r:rGrCr+r+r+r,r$4s   $r$c@s|eZdZdZddZeje dddZddZ eje dd d Z eje d d d Z eje d ddZ dS)TestUnconnectedSocketsz;Tests sockets which are open but not connected to anything.c CsFdtf}tttt|d }|j|}|j|jtj WdQRXdS)Nz 127.0.0.1)addr) rrrrrrGr7statusrI CONN_LISTEN)r)rPr9rFr+r+r, test_tcp_v4s  z"TestUnconnectedSockets.test_tcp_v4zIPv6 not supportedc CsFdtf}tttt|d }|j|}|j|jtj WdQRXdS)Nz::1)rP) rrrrrrGr7rQrIrR)r)rPr9rFr+r+r, test_tcp_v6s  z"TestUnconnectedSockets.test_tcp_v6c CsFdtf}tttt|d }|j|}|j|jtj WdQRXdS)Nz 127.0.0.1)rP) rrrrrrGr7rQrI CONN_NONE)r)rPr9rFr+r+r, test_udp_v4s  z"TestUnconnectedSockets.test_udp_v4c CsFdtf}tttt|d }|j|}|j|jtj WdQRXdS)Nz::1)rP) rrrrrrGr7rQrIrU)r)rPr9rFr+r+r, test_udp_v6s  z"TestUnconnectedSockets.test_udp_v6z POSIX onlycCsLt<}tt|td }|j|}|j|jtjWdQRXWdQRXdS)N)r=) r!rrrrGr7rQrIrU)r)namer9rFr+r+r, test_unix_tcps z$TestUnconnectedSockets.test_unix_tcpcCsLt<}tt|td }|j|}|j|jtjWdQRXWdQRXdS)N)r=) r!rrrrGr7rQrIrU)r)rXr9rFr+r+r, test_unix_udps z$TestUnconnectedSockets.test_unix_udpN)rLrMrN__doc__rSr skipIfrrTrVrWr rYrZr+r+r+r,rOsrOc@sTeZdZdZejedddZeje dddZ e e dd d Z d d Z d S)TestConnectedSocketPairszJTest socket pairs which are are actually connected to each other. zunreliable on SUONSc Cszdtf}tt|d\}}zHtjdd}|jt|d|j|djtj |j|djtj Wd|j |j XdS)Nz 127.0.0.1)rPtcp4)r&r;rr3) rrrr'r(r7r8rQrIZCONN_ESTABLISHEDclose)r)rPserverclientr*r+r+r,test_tcps  z!TestConnectedSocketPairs.test_tcpz POSIX onlycCs2t }t|\}}ztjdd}tr6dd|D}|jt|dtsRtsRt r|j|dj d|j|dj d|j||dj p|dj nzt rxt|dj |dj |dj |dj fD]}|j|dqWn:|j|dj p|dj ||j|dj p|dj |Wd|j |j XWdQRXdS) Nunix)r&cSsg|]}|jdkr|qS)z /var/run/log)raddr)r0r1r+r+r,r2sz6TestConnectedSocketPairs.test_unix..r;rr3)r!r"r'r(r r7r8rrr rdrBr r_)r)rXr`rar*rPr+r+r, test_unixs&    "z"TestConnectedSocketPairs.test_unix)Zonly_ifcsfdd}tjd}tjd}ddlm}tjjt}||jt t d|d}||jt t d|d}||jt t d |d}||jt t d |d} t |} t t|} t |} t t|} trt |}t t|}t | }t t|}nd}d}d}d}xtjD]}|j}jt|d x|D]}|j| jkr\|||t t| ftjdn|j| jkr|||t t| ftjdnZ|jt|ddkr|||t t|ftjdn,|jt|ddkr0|||t t|ftjdq0Wq Wjt|jdddS)Nc sd }t|j|j|j|j|j|j|j|j|j|j|x"|D]} |j| d } | |krXqXqXWtrj |j |gdS) Nr%inetinet4inet6tcpr^tcp6udpudp4udp6)r&) r%rgrhrirjr^rkrlrmrn) rr7r<r=rBrdrQr(rrCrH) procrFr<r=rBrdrQZkindsZ all_kindsr&r*)r)r+r, check_conns  z8TestConnectedSocketPairs.test_combos..check_conna import socket, time s = socket.socket($family, socket.SOCK_STREAM) s.bind(('$addr', 0)) s.listen(1) with open('$testfn', 'w') as f: f.write(str(s.getsockname()[:2])) time.sleep(60) z 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) r)Templatez 127.0.0.1)r<rPZtestfnz::1r3r%rgrhrjr^rlrmrHrirkrnz???)r&)r%rgrhrjr^)r%rgrhrlrm)r%rgrirjrk)r%rgrirlrn)textwrapdedentstringrqrDpathbasenamerZ substituteintrrrevalr#rr'Zchildrenr(r7r8rHrrIrRrrUgetattr assertRaises ValueError)r)rpZ tcp_templateZ udp_templaterqZtestfileZ tcp4_templateZ udp4_templateZ tcp6_templateZ udp6_templateZ tcp4_procZ tcp4_addrZ udp4_procZ udp4_addrZ tcp6_procZ tcp6_addrZ udp6_procZ udp6_addrpr*rFr+)r)r, test_combossb       z$TestConnectedSocketPairs.test_combosc Cst}tjdd}|jt|t|tjdd}|jt|trJdndx,|D]$}|j|jtt f|j|j t qVWtjdd}|jt|d|j|djt|j|dj t trtjdd}|jt|d|j|djt |j|dj t tjd d}|jt|tr(dndx.|D]&}|j|jtt f|j|j t q4Wtjd d}|jt|d|j|djt|j|dj t trtjd d}|jt|d|j|djt |j|dj t tjd d}|jt|trd ndx2|D]*}|j|jtt f|j|j t t fqWtrtjdd}|jt|dx.|D]&}|j|jt |j|j t t fqlWt rtjdd}|jt|dx.|D]&}|j|jt|j|j t t fqWWdQRXdS)Nr%)r&rjr;r3r^rrkrlrmrnrgrirc)rr'r(r7r8rassertInr<rrr=rrrr)r)socksr*rFr+r+r,test_multi_sockets_filteringes`                z5TestConnectedSocketPairs.test_multi_sockets_filteringN)rLrMrNr[r r\r rbr rfrr r}rr+r+r+r,r]s !br]c@sJeZdZdZeddZeddZeeje o6e dddZ d S) TestSystemWideConnectionszTests for net_connections().c sfdd}tddlm}xZ|jD]N\}}|dkrBt rBq*|\}}tj|}jt|tt |||||q*Wj t tjddWdQRXdS)NcsVttdt}xB|D]:}j|j||d|j|krFj|j||dt|qWdS)Nr)msg)ryr>objectrr<r=r)r*familiestypes_rrF)r)r+r,checks   z0TestSystemWideConnections.test_it..checkr) conn_tmaprcz???)r&) rpsutil._commonritemsrrIrJr7r8setrzr{)r)rrr&groupsrrr*r+)r)r,test_its   z!TestSystemWideConnections.test_itc Cs@t0}ddtjddD}|jt|t|WdQRXdS)NcSsg|]}|jtjkr|qSr+)rHrDrE)r0xr+r+r,r2sz>TestSystemWideConnections.test_multi_socks..r%)r&)rrIrJr7r8)r)rr*r+r+r,test_multi_sockssz*TestSystemWideConnections.test_multi_sockszunreliable on OSX + TRAVISc st}t|}WdQRXgd}xRt|D]F}tjjtt|}tj d|}t |}j |j |j t|q,Wx$t|D]}tt|}t|qWfddtjddD}xJD]B|jtfdd|D|tj} |jt| jd|qWdS)N a import time, os from psutil.tests import create_sockets with create_sockets(): with open('%s', 'w') as f: f.write(str(os.getpid())) time.sleep(60) csg|]}|jkr|qSr+)rH)r0r)pidsr+r,r2szFTestSystemWideConnections.test_multi_sockets_procs..r%)r&csg|]}|jkr|qSr+)rH)r0r)rHr+r,r2s)rr8rangerDrurealpathrstrrrrsrappendrHZ addCleanuprr#rIrJr7Processr() r)rZexpectedtimesiZfnamesrcZsprocZsysconsr|r+)rHrr,test_multi_sockets_procss(       z2TestSystemWideConnections.test_multi_sockets_procsN) rLrMrNr[rrrr r\r rrr+r+r+r,rs rc@seZdZddZdS)TestMisccCsg}g}xXttD]L}|jdrtt|}t|}|jt||j|||j||j|qWtrrtjtj t r|tj dS)NZCONN_) dirrI startswithryrZ assertNotInrr Z CONN_IDLEZ CONN_BOUNDrZCONN_DELETE_TCB)r)ZintsZstrsrXZnumZstr_r+r+r,test_connection_constantss     z"TestMisc.test_connection_constantsN)rLrMrNrr+r+r+r,rsr__main__)6r[rDr>rr contextlibrrrrrrIrrr r r r r rrrZpsutil._compatrZ psutil.testsrrrrrrrrrrrrrrrr r!r"r#rr'rr$ZTestCaserOr]rrrL__file__r+r+r+r,s^                                  \7`P