o
    Óó·išc  ã                   @   sÈ  d Z ddlmZmZ ddlmZmZ ddlmZ ddl	m
Z
 zddlmZ W n ey1   dZY nw ddlmZ d	d
 dd¡ Zd dd¡Zd dd¡Zd dd¡Zd dd¡Zd dd¡Zd dd¡Zd dd¡ZG dd„ dƒZG dd„ de
jƒZG dd„ deƒZG dd„ de
jƒZG dd„ de
jƒZG dd„ de
jƒZG d d!„ d!e
jƒZ eej!ƒG d"d#„ d#ƒƒZ"eej!ƒG d$d%„ d%ƒƒZ#G d&d'„ d'e
jƒZ$G d(d)„ d)e
jƒZ%G d*d+„ d+ej&ƒZ'G d,d-„ d-e
jƒZ(dS ).z(
Session Initialization Protocol tests.
é    )ÚcheckersÚportal)ÚdeferÚreactor)Úsip)Úunittest)ÚAsyncioSelectorReactorN)Úimplementerz


z?INVITE sip:foo SIP/2.0
From: mo
To: joe
Content-Length: 4

abcdÚ
z
z-INVITE sip:foo SIP/2.0
From: mo
To: joe

1234zHINVITE sip:foo SIP/2.0
From: mo
To: joe
Content-Length: 4

1234

lalalalz½INVITE sip:foo SIP/2.0
From: mo
To: joe
Content-Length: 0

INVITE sip:loop SIP/2.0
From: foo
To: bar
Content-Length: 4

abcdINVITE sip:loop SIP/2.0
From: foo
To: bar
Content-Length: 4

1234z4SIP/2.0 200 OK
From:  foo
To:bar
Content-Length: 0

z.INVITE sip:foo SIP/2.0
f: mo
t: joe
l: 4

abcdz=INVITE sip:foo SIP/2.0
Via: SIP/2.0/UDP 10.0.0.1:5060;rport

aý  SIP/2.0 200 OK
Via: SIP/2.0/UDP server10.biloxi.com
    ;branch=z9hG4bKnashds8;received=192.0.2.3
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com
    ;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com
    ;branch=z9hG4bK776asdhds ;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 0

c                   @   ó   e Zd Zdd„ ZdS )Ú	TestRealmc                 G   s   t jd dd„ fS )Nc                   S   s   d S ©N© r   r   r   ú[C:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/test/test_sip.pyÚ<lambda>€   s    z)TestRealm.requestAvatar.<locals>.<lambda>)r   ZIContact)ÚselfZavatarIdZmindZ
interfacesr   r   r   ÚrequestAvatar   s   zTestRealm.requestAvatarN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   ~   ó    r   c                   @   ó\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚMessageParsingTestsc                 C   s   g | _ t | j j¡| _d S r   )Úlr   ZMessagesParserÚappendÚparser©r   r   r   r   ÚsetUp„   s   zMessageParsingTests.setUpc                 C   s   | j  |¡ | j  ¡  d S r   ©r   ZdataReceivedZdataDone)r   Úmessager   r   r   ÚfeedMessageˆ   s   zMessageParsingTests.feedMessagec                 C   sN   |   |j|¡ |   |j ¡ |¡ |   |j|¡ |   |j|¡ |   |jd¡ dS )z$
        Validate Requests.
        é   N)ÚassertEqualÚmethodÚuriÚtoStringÚheadersÚbodyÚfinished)r   Úmr#   r$   r&   r'   r   r   r   ÚvalidateMessageŒ   s
   z#MessageParsingTests.validateMessagec              	   C   óH   | j }|  t¡ |  t|ƒd¡ |  |d dddgdgdgdœd	¡ d S ©
Nr!   r   ÚINVITEúsip:fooÚmoÚjoeÚ4©ÚfromÚtozcontent-lengthÚabcd)r   r    Úrequest1r"   Úlenr*   ©r   r   r   r   r   Ú
testSimple–   ó   
ûzMessageParsingTests.testSimplec              	   C   sr   | j }|  t¡ |  t¡ |  t|ƒd¡ |  |d dddgdgdgdœd	¡ |  |d
 dddgdgdœd¡ d S )Né   r   r-   r.   r/   r0   r1   r2   r5   r!   )r3   r4   Ú1234)r   r    r6   Úrequest2r"   r7   r*   r8   r   r   r   ÚtestTwoMessages¢   s   

ûÿz#MessageParsingTests.testTwoMessagesc              	   C   r+   )
Nr!   r   r-   r.   r/   r0   r1   r2   r<   )r   r    Úrequest3r"   r7   r*   r8   r   r   r   ÚtestGarbage²   r:   zMessageParsingTests.testGarbagec              	   C   s�   | j }|  t¡ |  t|ƒd¡ |  |d dddgdgdgdœd	¡ |  |d
 dddgdgdgdœd¡ |  |d dddgdgdgdœd¡ d S )Né   r   r-   r.   r/   r0   Ú0r2   Ú r!   zsip:loopÚfooÚbarr1   r5   r;   r<   )r   r    Úrequest4r"   r7   r*   r8   r   r   r   ÚtestThreeInOne¾   s0   
ûûûz"MessageParsingTests.testThreeInOnec              	   C   r+   r,   )r   r    Úrequest_shortr"   r7   r*   r8   r   r   r   Ú	testShortØ   r:   zMessageParsingTests.testShortc                 C   s€   | j }|  t¡ |  t|ƒd¡ |d }|  |jd¡ |  |jd¡ |  |jdgdgdgdœ¡ |  |jd	¡ |  |j	d¡ d S )
Nr!   r   éÈ   ÚOKrD   rE   rB   r2   rC   )
r   r    Ú	response1r"   r7   ÚcodeÚphraser&   r'   r(   ©r   r   r)   r   r   r   ÚtestSimpleResponseä   s   
ÿz&MessageParsingTests.testSimpleResponsec                 C   sn   | j }|  t¡ |  t|ƒd¡ |d }|  |jd d d¡ |  |jd d d¡ |  |jd d d¡ dS )	zv
        A header may be split across multiple lines.  Subsequent lines begin
        with C{" "} or C{"\t"}.
        r!   r   ÚviazHSIP/2.0/UDP server10.biloxi.com;branch=z9hG4bKnashds8;received=192.0.2.3zVSIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2r;   zHSIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.1N)r   r    Úresponse_multiliner"   r7   r&   rO   r   r   r   Útest_multiLineñ   s    
þþþz"MessageParsingTests.test_multiLineN)r   r   r   r   r    r*   r9   r>   r@   rG   rI   rP   rS   r   r   r   r   r   ƒ   s    
r   c                   @   s   e Zd ZdZdd„ ZdS )Ú%MessageParsingFeedDataCharByCharTestsz9
    Same as base class, but feed data char by char.
    c                 C   s$   |D ]}| j  |¡ q| j  ¡  d S r   r   )r   r   Úcr   r   r   r      s   z1MessageParsingFeedDataCharByCharTests.feedMessageN)r   r   r   Ú__doc__r    r   r   r   r   rT     s    rT   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚMakeMessageTestsc                 C   s,   t  dd¡}| dd¡ |  | ¡ d¡ d S )Nr-   r.   rD   rE   z$INVITE sip:foo SIP/2.0
Foo: bar

)r   ÚRequestÚ	addHeaderr"   r%   ©r   Úrr   r   r   ÚtestRequest  s   zMakeMessageTests.testRequestc                 C   sB   t  dd¡}| dd¡ | dd¡ | d¡ |  | ¡ d¡ d S )	NrJ   rK   rD   rE   zContent-Lengthr1   r<   z3SIP/2.0 200 OK
Foo: bar
Content-Length: 4

1234)r   ÚResponserY   ZbodyDataReceivedr"   r%   rZ   r   r   r   ÚtestResponse  s   
ÿzMakeMessageTests.testResponsec                 C   s   t  d¡}|  | ¡ d¡ d S )NrJ   zSIP/2.0 200 OK

)r   r]   r"   r%   rZ   r   r   r   ÚtestStatusCode%  s   
zMakeMessageTests.testStatusCodeN)r   r   r   r\   r^   r_   r   r   r   r   rW     s    	rW   c                   @   r   )ÚViaTestsc                 C   s"   |  ¡ }|  |t |¡  ¡ ¡ d S r   )r%   r"   r   ÚparseViaHeader)r   ÚvÚsr   r   r   ÚcheckRoundtrip+  s   zViaTests.checkRoundtripc                 C   sH   t  d¡}t  d¡}|  |j|j¡ |  |j|j¡ |  |j|j¡ d S )NzSIP/2.0/UDP 192.168.1.1:5060z SIP/2.0/UDP     192.168.1.1:5060)r   ra   r"   Ú	transportÚhostÚport)r   Zv1Zv2r   r   r   ÚtestExtraWhitespace/  s
   

zViaTests.testExtraWhitespacec                 C   s²   d}t  |¡}|  |jd¡ |  |jd¡ |  |jd¡ |  |j¡ |  |j¡ |  	|j
¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  | ¡ d	¡ |  |¡ d
S )zC
        Test parsing a Via header with one of everything.
        zVSIP/2.0/UDP first.example.com:4000;ttl=16;maddr=224.2.0.1 ;branch=a7c6a8dlze (Example)ÚUDPzfirst.example.comi   é   z	224.2.0.1Z
a7c6a8dlzer   zKSIP/2.0/UDP first.example.com:4000;ttl=16;branch=a7c6a8dlze;maddr=224.2.0.1N)r   ra   r"   re   rf   rg   ÚassertIsNoneÚrportÚ
rportValueÚassertFalseÚrportRequestedÚttlÚmaddrÚbranchÚhiddenr%   rd   ©r   rc   rb   r   r   r   Útest_complex6  s$   ÿ
þzViaTests.test_complexc                 C   sª   d}t  |¡}|  |jd¡ |  |jd¡ |  |jd¡ |  |j¡ |  |j¡ |  	|j
¡ |  |j¡ |  |j¡ |  |j¡ |  |j¡ |  | ¡ d¡ |  |¡ dS )z3
        Test parsing a simple Via header.
        zSIP/2.0/UDP example.com;hiddenri   úexample.coméÄ  z#SIP/2.0/UDP example.com:5060;hiddenN)r   ra   r"   re   rf   rg   rk   rl   rm   rn   ro   rp   rq   rr   Ú
assertTruers   r%   rd   rt   r   r   r   Útest_simpleP  s   
zViaTests.test_simplec                 C   s   t  d¡}|  |¡ d S )Nrv   )r   ÚViard   ©r   rb   r   r   r   ÚtestSimplerc  s   
zViaTests.testSimplerc                 C   sŽ   t jddd�}| j| jgd�}|  t|ƒd¡ |  |d d d¡ |  |d d	 t¡ |  | ¡ d
¡ |  |j	¡ |  |j
¡ |  |j¡ dS )z|
        Setting rport to True is deprecated, but still produces a Via header
        with the expected properties.
        úfoo.barT©rl   ©ZoffendingFunctionsr!   r   r   ú+rport=True is deprecated since Twisted 9.0.ÚcategoryúSIP/2.0/UDP foo.bar:5060;rportN)r   rz   ÚflushWarningsÚtest_deprecatedRPortr"   r7   ÚDeprecationWarningr%   rx   rl   ro   rk   rm   )r   rb   Úwarningsr   r   r   r„   g  s   ÿzViaTests.test_deprecatedRPortc                 C   s:   t jddd�}|  | ¡ d¡ |  |j¡ |  |j¡ dS )zU
        An rport setting of None should insert the parameter with no value.
        r}   Nr~   r‚   )r   rz   r"   r%   rx   ro   rk   rm   r{   r   r   r   Ú
test_rportz  s   zViaTests.test_rportc                 C   sJ   t jddd�}|  | ¡ d¡ |  |j¡ |  |jd¡ |  |jd¡ dS )zk
        An rport numeric setting should insert the parameter with the number
        value given.
        r}   r!   r~   z SIP/2.0/UDP foo.bar:5060;rport=1N)r   rz   r"   r%   rn   ro   rm   rl   r{   r   r   r   Útest_rportValueƒ  s
   zViaTests.test_rportValuec                 C   sn   d}t  |¡}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  | 	¡  
d¡d¡ d S )	Nz8SIP/2.0/UDP 10.0.0.1:5060;received=22.13.1.5;rport=12345ri   ú10.0.0.1rw   z	22.13.1.5i90  zrport=12345éÿÿÿÿ)r   ra   r"   re   rf   rg   Úreceivedrl   ZassertNotEqualr%   Úfindrt   r   r   r   ÚtestNATŽ  s   
zViaTests.testNATc                 C   s"   d}t  |¡}|  | ¡ |¡ dS )zZ
        Parsing and serializing Via headers with unknown parameters should work.
        z?SIP/2.0/UDP example.com:5060;branch=a12345b;bogus;pie=deliciousN)r   ra   r"   r%   rt   r   r   r   Útest_unknownParams™  s   
zViaTests.test_unknownParamsN)r   r   r   rd   rh   ru   ry   r|   r„   r‡   rˆ   r�   rŽ   r   r   r   r   r`   *  s    	r`   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚURLTestsc                 C   s$   dD ]}|   t |¡ ¡ |¡ qd S )N)zsip:j.doe@big.comz&sip:j.doe:secret@big.com;transport=tcpz!sip:j.doe@big.com?subject=projectzsip:example.com)r"   r   ÚparseURLr%   )r   Úurlr   r   r   ÚtestRoundtrip£  s   úzURLTests.testRoundtripc                 C   sZ   d}t  |¡}dddddddd	d
dddgfddddœffD ]\}}|  t||ƒ|¡ qd S )Nzesip:user:pass@hosta:123;transport=udp;user=phone;method=foo;ttl=12;maddr=1.2.3.4;blah;goo=bar?a=b&c=d)ÚusernameÚuser)ÚpasswordÚpass)rf   Zhosta)rg   é{   )re   Zudp)ZusertypeZphone)r#   rD   )rp   é   )rq   ú1.2.3.4ÚotherZblahzgoo=barr&   ÚbÚd)ÚarU   )r   r‘   r"   Úgetattr)r   rc   r’   Úkrb   r   r   r   ÚtestComplex¬  s"   ÿ

õózURLTests.testComplexN)r   r   r   r“   r¡   r   r   r   r   r�   ¢  s    	r�   c                   @   r   )Ú
ParseTestsc              
   C   s†   dddi fdddi fdddi fdddi fdd	dd
ddœffD ]"\}}}}t  |¡\}}}|  ||¡ |  | ¡ |¡ |  ||¡ qd S )Nz""A. G. Bell" <sip:foo@example.com>z
A. G. Bellzsip:foo@example.comzAnon <sip:foo@example.com>ZAnonrC   z<sip:foo@example.com>z)foo <sip:foo@example.com>;tag=bar;foo=bazrD   rE   Zbaz)ÚtagrD   )r   ZparseAddressr"   r%   )r   ÚaddressÚnameÚurlsÚparamsÚgnameZgurlZgparamsr   r   r   ÚtestParseAddressÃ  s&   ü


üöìzParseTests.testParseAddressN)r   r   r   r©   r   r   r   r   r¢   Â  r   r¢   c                   @   r   )ÚDummyLocatorc                 C   s   t  tjddd�¡S )Nú
server.comrw   ©rg   )r   Zsucceedr   ÚURL©r   Z
logicalURLr   r   r   Ú
getAddressÝ  s   zDummyLocator.getAddressN©r   r   r   r¯   r   r   r   r   rª   Û  ó    rª   c                   @   r   )ÚFailingLocatorc                 C   s   t  tƒ ¡S r   )r   ZfailÚLookupErrorr®   r   r   r   r¯   ã  s   zFailingLocator.getAddressNr°   r   r   r   r   r²   á  r±   r²   c                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )Ú
ProxyTestsc                    s0   t  d¡ˆ _tƒ ˆ j_g ˆ _‡ fdd„ˆ j_d S )Nú	127.0.0.1c                    ó   ˆ j  | |f¡S r   ©Úsentr   ©ÚdestÚmsgr   r   r   r   ì  ó    z"ProxyTests.setUp.<locals>.<lambda>)r   ZProxyÚproxyrª   Úlocatorr¸   ÚsendMessager   r   r   r   r   è  s   
zProxyTests.setUpc                 C   sä   t  dd¡}| dt  d¡ ¡ ¡ | dt  d¡ ¡ ¡ | dd¡ | dd	¡ | d
d¡ | j | ¡ d¡ |  t| j	ƒd¡ | j	d \}}|  |j
d¡ |  |jd¡ |  |j ¡ d¡ |  |jd¡ |  |jd g d¢¡ d S )Nr-   r.   rQ   rš   z1.2.3.5rD   rE   r4   ú<sip:joe@server.com>Úcontactz<sip:joe@1.2.3.5>©rš   rw   r!   r   rw   r«   )úSIP/2.0/UDP 127.0.0.1:5060úSIP/2.0/UDP 1.2.3.4:5060zSIP/2.0/UDP 1.2.3.5:5060)r   rX   rY   rz   r%   r½   ÚdatagramReceivedr"   r7   r¸   rg   rf   r$   r#   r&   ©r   r[   rº   r)   r   r   r   ÚtestRequestForwardî  s"   þzProxyTests.testRequestForwardc                 C   s€   t  dd¡}| dt  d¡ ¡ ¡ | dd¡ | dd¡ | d	d
¡ | j | ¡ d¡ | jd \}}|  |j	d ddg¡ d S )Nr-   r.   rQ   rš   rD   rE   r4   rÀ   rÁ   z<sip:joe@1.2.3.4>©z1.1.1.1rw   r   rÃ   z)SIP/2.0/UDP 1.2.3.4:5060;received=1.1.1.1)
r   rX   rY   rz   r%   r½   rÅ   r¸   r"   r&   rÆ   r   r   r   ÚtestReceivedRequestForward  s   þz%ProxyTests.testReceivedRequestForwardc                 C   sH   t  d¡}| dt  d¡ ¡ ¡ | j | ¡ d¡ |  t| j	ƒd¡ d S )NrJ   rQ   úfoo.comrÈ   r   )
r   r]   rY   rz   r%   r½   rÅ   r"   r7   r¸   rZ   r   r   r   ÚtestResponseWrongVia  s   
zProxyTests.testResponseWrongViac                 C   s¦   t  d¡}| dt  d¡ ¡ ¡ | dt jddd� ¡ ¡ | j | ¡ d¡ |  t| j	ƒd¡ | j	d	 \}}|  |j
|jfd
¡ |  |jd¡ |  |jd dg¡ d S )NrJ   rQ   rµ   ú
client.coméÒ  r¬   rÈ   r!   r   )rÌ   rÍ   zSIP/2.0/UDP client.com:1234)r   r]   rY   rz   r%   r½   rÅ   r"   r7   r¸   rf   rg   rM   r&   rÆ   r   r   r   ÚtestResponseForward  s   
zProxyTests.testResponseForwardc                 C   s„   t  d¡}| dt  d¡ ¡ ¡ | dt jddd� ¡ ¡ | j | ¡ d¡ |  t| j	ƒd¡ | j	d	 \}}|  |j
|jfd
¡ d S )NrJ   rQ   rµ   r‰   rÌ   )r‹   rÈ   r!   r   ©rÌ   rw   )r   r]   rY   rz   r%   r½   rÅ   r"   r7   r¸   rf   rg   rÆ   r   r   r   ÚtestReceivedResponseForward$  s   
z&ProxyTests.testReceivedResponseForwardc                    sŽ   t  d¡}| dt  d¡ ¡ ¡ g ‰ ‡ fdd„| j_| j | ¡ d¡ |  t	ˆ ƒd¡ ˆ d \}}|  t	|j
 dg ¡ƒd¡ |  |jd¡ d S )	NrJ   rQ   rµ   c                     s
   ˆ   | ¡S r   )r   )rž   ©r   r   r   r   1  s   
 z-ProxyTests.testResponseToUs.<locals>.<lambda>rÈ   r!   r   )r   r]   rY   rz   r%   r½   ZgotResponserÅ   r"   r7   r&   ÚgetrM   )r   r[   r)   Úaddrr   rÑ   r   ÚtestResponseToUs-  s   
zProxyTests.testResponseToUsc                 C   s\   t  dd¡}| dt  d¡ ¡ ¡ | dt  d¡ ¡ ¡ | j | ¡ d¡ |  | jg ¡ d S )Nr-   r.   rQ   rš   rµ   rÏ   )	r   rX   rY   rz   r%   r½   rÅ   r"   r¸   rZ   r   r   r   ÚtestLoop8  s
   zProxyTests.testLoopc                 C   s¤   t  dd¡}| dt  d¡ ¡ ¡ | dd¡ tƒ | j_| j | ¡ d¡ |  	t
| jƒd¡ | jd	 \}}|  	|j|jfd¡ |  	|jd
¡ |  	|jd dg¡ d S )Nr-   r.   rQ   rš   r4   rÀ   rÂ   r!   r   i”  rÄ   )r   rX   rY   rz   r%   r²   r½   r¾   rÅ   r"   r7   r¸   rf   rg   rM   r&   rÆ   r   r   r   ÚtestCantForwardRequest?  s   
z!ProxyTests.testCantForwardRequestN)r   r   r   r   rÇ   rÉ   rË   rÎ   rÐ   rÔ   rÕ   rÖ   r   r   r   r   r´   ç  s    	r´   c                   @   sl   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚRegistrationTestsc                    sF   t jdd�ˆ _t  d¡ˆ _ˆ j ˆ j_ˆ j_g ˆ _‡ fdd„ˆ j_d S )Nrµ   ©rf   úbell.example.comc                    r¶   r   r·   r¹   r   r   r   r   R  r¼   z)RegistrationTests.setUp.<locals>.<lambda>)r   ÚRegisterProxyr½   ÚInMemoryRegistryÚregistryr¾   r¸   r¿   r   r   r   r   r   M  s
   zRegistrationTests.setUpc                 C   s&   | j j ¡ D ]\}}| ¡  q| `d S r   )rÜ   ÚusersÚvaluesÚcancelr½   )r   r�   r$   r   r   r   ÚtearDownT  s   
zRegistrationTests.tearDownc                 C   sP   t  dd¡}| dd¡ | dd¡ | dt  d¡ ¡ ¡ | j | ¡ d	¡ d S )
NÚREGISTERúsip:bell.example.comr4   úsip:joe@bell.example.comrÁ   úsip:joe@client.com:1234rQ   rÌ   rÏ   ©r   rX   rY   rz   r%   r½   rÅ   rZ   r   r   r   ÚregisterY  s
   zRegistrationTests.registerc                 C   s\   t  dd¡}| dd¡ | dd¡ | dt  d¡ ¡ ¡ | d	d
¡ | j | ¡ d¡ d S )Nrá   râ   r4   rã   rÁ   Ú*rQ   rÌ   ÚexpiresrB   rÏ   rå   rZ   r   r   r   Ú
unregister`  s   zRegistrationTests.unregisterc                 C   s  |   ¡  | jd \}}|  |j|jfd¡ |  |jd¡ |  |jd dg¡ |  |jd dg¡ |  |jd d	g¡ ttƒt	krN|  
t|jd
 d ƒdv ¡ |  t| jjƒd¡ | jjd \}}|  | ¡ d	¡ | jj tjddd�¡}| dd„ ¡ | | jd¡ |S )Nr   rÏ   rJ   rQ   úSIP/2.0/UDP client.com:5060r4   rã   rÁ   úsip:joe@client.com:5060rè   )i  i  i  i  r!   r0   rÙ   ©r”   rf   c                 S   s   | j | jfS r   ©rf   rg   )Zdesturlr   r   r   r   {  s    z0RegistrationTests.testRegister.<locals>.<lambda>)ræ   r¸   r"   rf   rg   rM   r&   Útyper   r   rx   Úintr7   rÜ   rÝ   r%   r½   r¾   r¯   r   r­   ÚaddCallback)r   rº   r)   Údcr$   r�   r   r   r   ÚtestRegisterh  s$   ÿzRegistrationTests.testRegisterc                 C   s¤   |   ¡  |  ¡  | jd \}}|  |j|jfd¡ |  |jd¡ |  |jd dg¡ |  |jd dg¡ |  |jd d	g¡ |  |jd
 dg¡ |  | jj	i ¡ d S )Nr!   rÏ   rJ   rQ   rê   r4   rã   rÁ   rë   rè   rB   )
ræ   ré   r¸   r"   rf   rg   rM   r&   rÜ   rÝ   ©r   rº   r)   r   r   r   ÚtestUnregister  s   z RegistrationTests.testUnregisterc                 C   s:   t ƒ }t |¡}t ¡ }| dd¡ | |¡ || j_d S )NzuserXname@127.0.0.1Z	passXword)r   r   ZPortalr   Z'InMemoryUsernamePasswordDatabaseDontUseZaddUserZregisterCheckerr½   )r   r[   ÚprU   r   r   r   Ú	addPortal‹  s   

zRegistrationTests.addPortalc                 C   sV   |   ¡  |  ¡  |  t| jjƒd¡ |  t| jƒd¡ | jd \}}|  |jd¡ d S )Nr   r!   i‘  )rö   ræ   r"   r7   rÜ   rÝ   r¸   rM   ró   r   r   r   ÚtestFailedAuthentication“  s   z*RegistrationTests.testFailedAuthenticationc                 C   ób   t  dd¡}| dd¡ | dd¡ | dt  d¡ ¡ ¡ | j | ¡ d	¡ |  t| j	ƒd
¡ d S )Nrá   zsip:wrong.comr4   rã   rÁ   rä   rQ   rÌ   rÏ   r   ©
r   rX   rY   rz   r%   r½   rÅ   r"   r7   r¸   rZ   r   r   r   ÚtestWrongDomainRegisterœ  ó   z)RegistrationTests.testWrongDomainRegisterc                 C   rø   )Nrá   râ   r4   zsip:joe@foo.comrÁ   rä   rQ   rÌ   rÏ   r   rù   rZ   r   r   r   ÚtestWrongToDomainRegister¤  rû   z+RegistrationTests.testWrongToDomainRegisterc                 C   ó4   |   ¡  tjddd�}| jj |¡}|  |t¡ |S )Nr0   rÊ   rì   ©ræ   r   r­   r½   r¾   r¯   ZassertFailurer³   ©r   r’   r�   r   r   r   ÚtestWrongDomainLookup¬  ó
   z'RegistrationTests.testWrongDomainLookupc                 C   rý   )NZjanerÙ   rì   rþ   rÿ   r   r   r   ÚtestNoContactLookup³  r  z%RegistrationTests.testNoContactLookupN)r   r   r   r   rà   ræ   ré   rò   rô   rö   r÷   rú   rü   r   r  r   r   r   r   r×   L  s    	r×   c                   @   r�   )ÚClientc                 C   s    t j | ¡ g | _t ¡ | _d S r   )r   ÚBaseÚ__init__r‹   r   ZDeferredÚdeferredr   r   r   r   r  ¼  s   zClient.__init__c                 C   s   | j  |¡ | j | j ¡ d S r   )r‹   r   r  Úcallback)r   ÚresponserÓ   r   r   r   Úhandle_responseÁ  s   zClient.handle_responseN)r   r   r   r  r	  r   r   r   r   r  »  s    r  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú	LiveTestsc                 C   sz   t jdd�| _t  d¡| _| j | j_| j_tjd| jdd�| _t	ƒ | _
tjd| j
dd�| _| j ¡ j| j ¡ jf| _d S )Nrµ   rØ   rÙ   r   )Z	interface)r   rÚ   r½   rÛ   rÜ   r¾   r   Z	listenUDPÚ
serverPortr  ÚclientÚ
clientPortÚgetHostrf   rg   ÚserverAddressr   r   r   r   r   Ç  s   


þzLiveTests.setUpc                 C   sH   | j j ¡ D ]\}}| ¡  qt | jj¡}t | jj¡}t 	||g¡S r   )
rÜ   rÝ   rÞ   rß   r   ZmaybeDeferredr  ÚstopListeningr  ZgatherResults)r   r�   r$   Zd1Zd2r   r   r   rà   Ó  s
   
zLiveTests.tearDownc                    sŽ   ˆ j  ¡ j}t dd¡}| dd¡ | dd| ¡ | dtjd|d	� ¡ ¡ ˆ j 	tj
dˆ jd
 d�|¡ ˆ jj}‡ fdd„}| |¡ |S )Nrá   râ   r4   rã   rÁ   úsip:joe@127.0.0.1:%drQ   rµ   r¬   r!   rí   c                    ó*   ˆ   t| ƒd¡ | d }ˆ   |jd¡ d S ©Nr!   r   rJ   ©r"   r7   rM   ©r‹   r[   r   r   r   Úcheckå  ó   z%LiveTests.testRegister.<locals>.check)r  r  rg   r   rX   rY   rz   r%   r  r¿   r­   r  r  rð   )r   rõ   r[   r�   r  r   r   r   rò   Ú  s   ÿ
zLiveTests.testRegisterc                    sØ   ˆ j  ¡ j}t dd¡}| dd¡ | dd| ¡ | dtjd|d	d
� ¡ ¡ ˆ jˆ j	gd�}ˆ  
t|ƒd¡ ˆ  
|d d d¡ ˆ  
|d d t¡ ˆ j tjdˆ jd d�|¡ ˆ jj}‡ fdd„}| |¡ |S )ap  
        rport is allowed without a value, apparently because server
        implementors might be too stupid to check the received port
        against 5060 and see if they're equal, and because client
        implementors might be too stupid to bind to port 5060, or set a
        value on the rport parameter they send if they bind to another
        port.
        rá   râ   r4   rã   rÁ   r  rQ   rµ   T)rg   rl   r   r!   r   r   r€   r�   rí   c                    r  r  r  r  r   r   r   r    r  z)LiveTests.test_amoralRPort.<locals>.checkN)r  r  rg   r   rX   rY   rz   r%   rƒ   Útest_amoralRPortr"   r7   r…   r  r¿   r­   r  r  rð   )r   rõ   r[   r†   r�   r  r   r   r   r  í  s$   	ÿÿ
zLiveTests.test_amoralRPortN)r   r   r   r   rà   rò   r  r   r   r   r   r
  Æ  s
    r
  ))rV   Ztwisted.credr   r   Ztwisted.internetr   r   Ztwisted.protocolsr   Ztwisted.trialr   Ztwisted.internet.asyncioreactorr   ÚBaseExceptionZzope.interfacer	   Úreplacer6   r=   r?   rF   rL   rH   Zrequest_nattedrR   r   ZTestCaser   rT   rW   r`   r�   r¢   ZILocatorrª   r²   r´   r×   r  r  r
  r   r   r   r   Ú<module>   sŠ   ÿÿùÿÿü	ÿùÿñÿû
ÿú
ÿü	ÿñ 	x eo