U
     T‚gš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k
rd   dZY nX 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                   @   s   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   ú9/tmp/pip-unpacked-wheel-1_7di8ic/twisted/test/test_sip.pyÚ<lambda>€   ó    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   ~   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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   sH   | 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–   s    
û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,   r-   r.   r/   r2   r   )r0   r1   Ú1234)r   r   r3   Úrequest2r    r4   r(   r5   r   r   r   ÚtestTwoMessages¢   s$    

û    ÿz#MessageParsingTests.testTwoMessagesc              	   C   sH   | j }|  t¡ |  t|ƒd¡ |  |d dddgdgdgdœd	¡ d S )
Nr   r   r*   r+   r,   r-   r.   r/   r8   )r   r   Úrequest3r    r4   r(   r5   r   r   r   ÚtestGarbage²   s    
û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,   r-   Ú0r/   Ú r   zsip:loopÚfooÚbarr.   r2   r7   r8   )r   r   Úrequest4r    r4   r(   r5   r   r   r   ÚtestThreeInOne¾   s0    
ûûûz"MessageParsingTests.testThreeInOnec              	   C   sH   | j }|  t¡ |  t|ƒd¡ |  |d dddgdgdgdœd	¡ d S r)   )r   r   Úrequest_shortr    r4   r(   r5   r   r   r   Ú	testShortØ   s    
û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   éÈ   ÚOKr@   rA   r>   r/   r?   )
r   r   Ú	response1r    r4   Ú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.2r7   zHSIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.1N)r   r   Úresponse_multiliner    r4   r$   rK   r   r   r   Útest_multiLineñ   s     
þþþz"MessageParsingTests.test_multiLineN)r   r   r   r   r   r(   r6   r:   r<   rC   rE   rL   rO   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   rP     s   rP   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+   r@   rA   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 )	NrF   rG   r@   rA   zContent-Lengthr.   r8   z3SIP/2.0 200 OK
Foo: bar
Content-Length: 4

1234)r   ÚResponserU   ZbodyDataReceivedr    r#   rV   r   r   r   ÚtestResponse  s    
 ÿzMakeMessageTests.testResponsec                 C   s   t  d¡}|  | ¡ d¡ d S )NrF   zSIP/2.0 200 OK

)r   rY   r    r#   rV   r   r   r   ÚtestStatusCode%  s    
zMakeMessageTests.testStatusCodeN)r   r   r   rX   rZ   r[   r   r   r   r   rS     s   	rS   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d„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú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   r]   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   r]   r    ra   rb   rc   ÚassertIsNoneÚrportÚ
rportValueÚassertFalseÚrportRequestedÚttlÚmaddrÚbranchÚhiddenr#   r`   ©r   r_   r^   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;hiddenre   úexample.coméÄ  z#SIP/2.0/UDP example.com:5060;hiddenN)r   r]   r    ra   rb   rc   rg   rh   ri   rj   rk   rl   rm   rn   Ú
assertTruero   r#   r`   rp   r   r   r   Útest_simpleP  s    
zViaTests.test_simplec                 C   s   t  d¡}|  |¡ d S )Nrr   )r   ÚViar`   ©r   r^   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©rh   ©ZoffendingFunctionsr   r   r   ú+rport=True is deprecated since Twisted 9.0.ÚcategoryúSIP/2.0/UDP foo.bar:5060;rportN)r   rv   ÚflushWarningsÚtest_deprecatedRPortr    r4   ÚDeprecationWarningr#   rt   rh   rk   rg   ri   )r   r^   Ú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.
        ry   Nrz   r~   )r   rv   r    r#   rt   rk   rg   ri   rw   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.
        ry   r   rz   z SIP/2.0/UDP foo.bar:5060;rport=1N)r   rv   r    r#   rj   rk   ri   rh   rw   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=12345re   ú10.0.0.1rs   z	22.13.1.5i90  zrport=12345éÿÿÿÿ)r   r]   r    ra   rb   rc   Úreceivedrh   ZassertNotEqualr#   Úfindrp   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   r]   r    r#   rp   r   r   r   Útest_unknownParams™  s    
zViaTests.test_unknownParamsN)r   r   r   r`   rd   rq   ru   rx   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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)rb   Zhosta)rc   é{   )ra   Zudp)ZusertypeZphone)r!   r@   )rl   é   )rm   ú1.2.3.4ÚotherZblahzgoo=barr$   ÚbÚd)ÚarQ   )r   rŒ   r    Úgetattr)r   r_   r�   Úkr^   r   r   r   ÚtestComplex¬  s     ÿ

õzURLTests.testComplexN)r   r   r   rŽ   rœ   r   r   r   r   r‹   ¢  s   	r‹   c                   @   s   e Zd Zdd„ ZdS )Ú
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 ]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Anonr?   z<sip:foo@example.com>z)foo <sip:foo@example.com>;tag=bar;foo=bazr@   rA   Zbaz)Útagr@   )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�   Â  s   r�   c                   @   s   e Zd Zdd„ ZdS )ÚDummyLocatorc                 C   s   t  tjddd�¡S )Nú
server.comrs   ©rc   )r   Zsucceedr   ÚURL©r   Z
logicalURLr   r   r   Ú
getAddressÝ  s    zDummyLocator.getAddressN©r   r   r   rª   r   r   r   r   r¥   Û  s   r¥   c                   @   s   e Zd Zdd„ ZdS )ÚFailingLocatorc                 C   s   t  tƒ ¡S r   )r   ZfailÚLookupErrorr©   r   r   r   rª   ã  s    zFailingLocator.getAddressNr«   r   r   r   r   r¬   á  s   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                    s   ˆ j  | |f¡S r   ©Úsentr   ©ÚdestÚmsgr   r   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 dddg¡ d S )Nr*   r+   rM   r•   z1.2.3.5r@   rA   r1   ú<sip:joe@server.com>Úcontactz<sip:joe@1.2.3.5>©r•   rs   r   r   rs   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   rT   rU   rv   r#   rµ   ÚdatagramReceivedr    r4   r±   rc   rb   r"   r!   r$   ©r   rW   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+   rM   r•   r@   rA   r1   r¸   r¹   z<sip:joe@1.2.3.4>©z1.1.1.1rs   r   r»   z)SIP/2.0/UDP 1.2.3.4:5060;received=1.1.1.1)
r   rT   rU   rv   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 )NrF   rM   úfoo.comrÀ   r   )
r   rY   rU   rv   r#   rµ   r½   r    r4   r±   rV   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 )NrF   rM   r¯   ú
client.coméÒ  r§   rÀ   r   r   )rÄ   rÅ   zSIP/2.0/UDP client.com:1234)r   rY   rU   rv   r#   rµ   r½   r    r4   r±   rb   rc   rI   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 )NrF   rM   r¯   r…   rÄ   )r‡   rÀ   r   r   ©rÄ   rs   )r   rY   rU   rv   r#   rµ   r½   r    r4   r±   rb   rc   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 )	NrF   rM   r¯   c                     s
   ˆ   | ¡S r   )r   )r™   ©r   r   r   r   1  r   z-ProxyTests.testResponseToUs.<locals>.<lambda>rÀ   r   r   )r   rY   rU   rv   r#   rµ   ZgotResponser½   r    r4   r$   ÚgetrI   )r   rW   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+   rM   r•   r¯   rÇ   )	r   rT   rU   rv   r#   rµ   r½   r    r±   rV   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+   rM   r•   r1   r¸   rº   r   r   i”  r¼   )r   rT   rU   rv   r#   r¬   rµ   r¶   r½   r    r4   r±   rb   rc   rI   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¯   ©rb   úbell.example.comc                    s   ˆ j  | |f¡S 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.comr1   úsip:joe@bell.example.comr¹   úsip:joe@client.com:1234rM   rÄ   rÇ   ©r   rT   rU   rv   r#   rµ   r½   rV   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Ú   r1   rÛ   r¹   Ú*rM   rÄ   Úexpiresr>   rÇ   rÝ   rV   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rœ|  
t|jd
 d ƒdk¡ |  t| jjƒd¡ | jjd \}}|  | ¡ d	¡ | jj tjddd�¡}| dd„ ¡ | | jd¡ |S )Nr   rÇ   rF   rM   úSIP/2.0/UDP client.com:5060r1   rÛ   r¹   úsip:joe@client.com:5060rà   )i  i  i  i  r   r-   rÑ   ©r�   rb   c                 S   s   | j | jfS r   ©rb   rc   )Zdesturlr   r   r   r   {  r   z0RegistrationTests.testRegister.<locals>.<lambda>)rÞ   r±   r    rb   rc   rI   r$   Útyper   r   rt   Úintr4   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Ç   rF   rM   râ   r1   rÛ   r¹   rã   rà   r>   )
rÞ   rá   r±   r    rb   rc   rI   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   rW   ÚprQ   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    r4   rÔ   rÕ   r±   rI   rë   r   r   r   ÚtestFailedAuthentication“  s    z*RegistrationTests.testFailedAuthenticationc                 C   sb   t  dd¡}| dd¡ | dd¡ | dt  d¡ ¡ ¡ | j | ¡ d	¡ |  t| j	ƒd
¡ d S )NrÙ   zsip:wrong.comr1   rÛ   r¹   rÜ   rM   rÄ   rÇ   r   ©
r   rT   rU   rv   r#   rµ   r½   r    r4   r±   rV   r   r   r   ÚtestWrongDomainRegisterœ  s    z)RegistrationTests.testWrongDomainRegisterc                 C   sb   t  dd¡}| dd¡ | dd¡ | dt  d¡ ¡ ¡ | j | ¡ d	¡ |  t| j	ƒd
¡ d S )NrÙ   rÚ   r1   zsip:joe@foo.comr¹   rÜ   rM   rÄ   rÇ   r   rð   rV   r   r   r   ÚtestWrongToDomainRegister¤  s    z+RegistrationTests.testWrongToDomainRegisterc                 C   s4   |   ¡  tjddd�}| jj |¡}|  |t¡ |S )Nr-   rÂ   rä   ©rÞ   r   r¨   rµ   r¶   rª   ZassertFailurer­   ©r   r�   r˜   r   r   r   ÚtestWrongDomainLookup¬  s
    z'RegistrationTests.testWrongDomainLookupc                 C   s4   |   ¡  tjddd�}| jj |¡}|  |t¡ |S )NZjanerÑ   rä   ró   rô   r   r   r   ÚtestNoContactLookup³  s
    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                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú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ÚgetHostrb   rc   Ú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"   Ú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Ú   r1   rÛ   r¹   úsip:joe@127.0.0.1:%drM   r¯   r§   r   rå   c                    s*   ˆ   t| ƒd¡ | d }ˆ   |jd¡ d S ©Nr   r   rF   ©r    r4   rI   ©r‡   rW   r   r   r   Úcheckå  s    z%LiveTests.testRegister.<locals>.check)r  r  rc   r   rT   rU   rv   r#   r   r·   r¨   r  rú   rè   )r   rí   rW   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Ú   r1   rÛ   r¹   r  rM   r¯   T)rc   rh   r{   r   r   r   r|   r}   rå   c                    s*   ˆ   t| ƒd¡ | d }ˆ   |jd¡ d S r  r  r	  r   r   r   r
    s    z)LiveTests.test_amoralRPort.<locals>.check)r  r  rc   r   rT   rU   rv   r#   r   Útest_amoralRPortr    r4   r�   r   r·   r¨   r  rú   rè   )r   rí   rW   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þ   ))rR   Ztwisted.credr   r   Ztwisted.internetr   r   Ztwisted.protocolsr   Ztwisted.trialr   Ztwisted.internet.asyncioreactorr   ÚBaseExceptionZzope.interfacer	   Úreplacer3   r9   r;   rB   rH   rD   Zrequest_nattedrN   r   ZTestCaser   rP   rS   r\   r‹   r�   ZILocatorr¥   r¬   r®   rÏ   rø   r÷   rþ   r   r   r   r   Ú<module>   sx   
 ùÿÿ û	 ø ð ú
 ù
 û	 ð 	x eo