U
    ¹êW[Äb  ã                   @   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   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.
é    )ÚportalÚcheckers)Ú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   ú7/usr/lib/python3/dist-packages/twisted/test/test_sip.pyÚ<lambda>m   ó    z)TestRealm.requestAvatar.<locals>.<lambda>)r   ZIContact)ÚselfZavatarIdZmindZ
interfacesr   r   r   ÚrequestAvatarl   s    zTestRealm.requestAvatarN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   k   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   ÚsetUpr   s    zMessageParsingTests.setUpc                 C   s   | j  |¡ | j  ¡  d S r   ©r   ZdataReceivedZdataDone)r   Úmessager   r   r   ÚfeedMessagew   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   q   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_complex   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_simple7  s     

ÿzViaTests.test_simplec                 C   s   t  d¡}|  |¡ d S )Nrr   )r   ÚViar`   ©r   r^   r   r   r   ÚtestSimplerL  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€   Q  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_rporth  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_rportValuer  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)Z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   ZaddressÚnameZurlsZparamsZ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     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   ÚtestLoop%  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   B  r   z)RegistrationTests.setUp.<locals>.<lambda>)r   ÚRegisterProxyr°   ÚInMemoryRegistryÚregistryr±   r¬   r²   r   r   r   r   r   =  s
    zRegistrationTests.setUpc                 C   s&   | j j ¡ D ]\}}| ¡  q| `d S r   )rÏ   ÚusersÚvaluesÚcancelr°   )r   r—   r"   r   r   r   ÚtearDownE  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   ÚregisterK  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   Ú
unregisterS  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   o  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'   Zdcr"   r—   r   r   r   ÚtestRegister\  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   ÚtestUnregistert  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Ê   ;  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   Z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ú   Z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Õ   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  í  s4    	ÿ
þ
þÿþ
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   Z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>   sr   
 ú	 ü ù
 ñ û ú ü ñz l|