
    \dc                        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
 	 ddlmZ n# e$ r dZY nw xY wddlmZ d	d
                    dd          z   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          Z G d de
j                  Z G d de          Z G d de
j                  Z G d de
j                  Z G d de
j                  Z G d  d!e
j                  Z  eej!                   G d" d#                      Z" eej!                   G d$ d%                      Z# G d& d'e
j                  Z$ G d( d)e
j                  Z% G d* d+ej&                  Z' G 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

lalalalzINVITE 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 ZdS )	TestRealmc                 "    t           j        d d fS )Nc                      d S N r       5lib/python3.11/site-packages/twisted/test/test_sip.py<lambda>z)TestRealm.requestAvatar.<locals>.<lambda>   s    4 r   )r   IContact)selfavatarIdmind
interfacess       r   requestAvatarzTestRealm.requestAvatar   s    |T<<//r   N)__name__
__module____qualname__r   r   r   r   r   r   ~   s#        0 0 0 0 0r   r   c                   J    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )MessageParsingTestsc                 Z    g | _         t          j        | j         j                  | _        d S r   )lr   MessagesParserappendparserr   s    r   setUpzMessageParsingTests.setUp   s#    (77r   c                 l    | j                             |           | j                                          d S r   r$   dataReceiveddataDone)r   messages     r   feedMessagezMessageParsingTests.feedMessage   s2      )))r   c                 8   |                      |j        |           |                      |j                                        |           |                      |j        |           |                      |j        |           |                      |j        d           dS )z$
        Validate Requests.
           N)assertEqualmethoduritoStringheadersbodyfinished)r   mr0   r1   r3   r4   s         r   validateMessagez#MessageParsingTests.validateMessage   s     	6***))3///G,,,&&&Q'''''r   c           	          | 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/   lenr7   r   r!   s     r   
testSimplezMessageParsingTests.testSimple   ~    F"""Q###aDVE7seDD	
 	
 	
 	
 	
r   c           	      V   | 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?   rB   r.   )r@   rA   1234)r!   r,   rC   request2r/   rD   r7   rE   s     r   testTwoMessagesz#MessageParsingTests.testTwoMessages   s    F""""""Q###aDVE7seDD	
 	
 	
 	aD(Iug'F'F	
 	
 	
 	
 	
r   c           	          | 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?   rJ   )r!   r,   request3r/   rD   r7   rE   s     r   testGarbagezMessageParsingTests.testGarbage   rG   r   c           	      r   | 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>   rB   rI   rJ   )r!   r,   request4r/   rD   r7   rE   s     r   testThreeInOnez"MessageParsingTests.testThreeInOne   s    F"""Q###aDVE7seDD	
 	
 	
 	aDWUGuEE	
 	
 	
 	aDWUGuEE	
 	
 	
 	
 	
r   c           	          | j         }|                     t                     |                     t	          |          d           |                     |d         dddgdgdgdd	           d S r9   )r!   r,   request_shortr/   rD   r7   rE   s     r   	testShortzMessageParsingTests.testShort   s~    F'''Q###aDVE7seDD	
 	
 	
 	
 	
r   c                    | 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      OKrT   rU   rR   r?   rS   )
r!   r,   	response1r/   rD   codephraser3   r4   r5   r   r!   r6   s      r   testSimpleResponsez&MessageParsingTests.testSimpleResponse   s    F###Q###aD%%%4(((Iw3%PP	
 	
 	
 	$$$Q'''''r   c                    | 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.2rI   zHSIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.1N)r!   r,   response_multiliner/   rD   r3   ra   s      r   test_multiLinez"MessageParsingTests.test_multiLine   s    
 F+,,,Q###aDIeQ7	
 	
 	

 	IeQ?	
 	
 	

 	IeQ:	
 	
 	
 	
 	
r   N)r   r   r   r&   r,   r7   rF   rL   rO   rW   rZ   rb   rf   r   r   r   r   r      s        8 8 8  ( ( (

 

 


 
 
 

 

 


 
 
4

 

 

( ( (
 
 
 
 
r   r   c                       e Zd ZdZd ZdS )%MessageParsingFeedDataCharByCharTestsz9
    Same as base class, but feed data char by char.
    c                 v    |D ]}| j                             |           | j                                          d S r   r(   )r   r+   cs      r   r,   z1MessageParsingFeedDataCharByCharTests.feedMessage  sD     	( 	(AK$$Q''''r   N)r   r   r   __doc__r,   r   r   r   rh   rh     s-             r   rh   c                        e Zd Zd Zd Zd ZdS )MakeMessageTestsc                     t          j        dd          }|                    dd           |                     |                                d           d S )Nr:   r;   rT   rU   z$INVITE sip:foo SIP/2.0
Foo: bar

)r   Request	addHeaderr/   r2   r   rs     r   testRequestzMakeMessageTests.testRequest  sL    K),,	E5!!!'STTTTTr   c                    t          j        dd          }|                    dd           |                    dd           |                    d           |                     |                                d           d S )	Nr\   r]   rT   rU   zContent-Lengthr>   rJ   z3SIP/2.0 200 OK
Foo: bar
Content-Length: 4

1234)r   Responserp   bodyDataReceivedr/   r2   rq   s     r   testResponsezMakeMessageTests.testResponse  s    Ld##	E5!!!	$c***	6"""JJLLW	
 	
 	
 	
 	
r   c                 ~    t          j        d          }|                     |                                d           d S )Nr\   zSIP/2.0 200 OK

)r   ru   r/   r2   rq   s     r   testStatusCodezMakeMessageTests.testStatusCode%  s6    L'?@@@@@r   N)r   r   r   rs   rw   ry   r   r   r   rm   rm     sI        U U U

 
 
A A A A Ar   rm   c                   J    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )ViaTestsc                     |                                 }|                     |t          j        |                                                      d S r   )r2   r/   r   parseViaHeader)r   vss      r   checkRoundtripzViaTests.checkRoundtrip+  sB    JJLLC.q11::<<=====r   c                    t          j        d          }t          j        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   v1v2s      r   testExtraWhitespacezViaTests.testExtraWhitespace/  sx     >?? BCCr|444"'***"'*****r   c                    d}t          j        |          }|                     |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.1
a7c6a8dlzer   zKSIP/2.0/UDP first.example.com:4000;ttl=16;branch=a7c6a8dlze;maddr=224.2.0.1N)r   r}   r/   r   r   r   assertIsNonerport
rportValueassertFalserportRequestedttlmaddrbranchhiddenr2   r   r   r   r~   s      r   test_complexzViaTests.test_complex6  sN   
, 	
 q!!e,,,!4555&&&!'"""!,''')***###+...<0001%%%JJLL8	
 	
 	

 	Ar   c                    d}t          j        |          }|                     |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;hiddenr   example.com  z#SIP/2.0/UDP example.com:5060;hiddenN)r   r}   r/   r   r   r   r   r   r   r   r   r   r   r   
assertTruer   r2   r   r   s      r   test_simplezViaTests.test_simpleP  s3    -q!!e,,,///&&&!'"""!,''')***!%   !'"""!(###!!!'LMMMAr   c                 X    t          j        d          }|                     |           d S )Nr   )r   Viar   r   r~   s     r   testSimplerzViaTests.testSimplerc  s+    GM""Ar   c                 .   t          j        dd          }|                     | j        g          }|                     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r   offendingFunctionsr.   r   r+   +rport=True is deprecated since Twisted 9.0.categorySIP/2.0/UDP foo.bar:5060;rportN)r   r   flushWarningstest_deprecatedRPortr/   rD   DeprecationWarningr2   r   r   r   r   r   )r   r~   warningss      r   r   zViaTests.test_deprecatedRPortg  s    
 GIT***%%$:S9T%UUX***QK	"$Q	
 	
 	
 	!Z02DEEE'GHHH   ()))!,'''''r   c                     t          j        dd          }|                     |                                d           |                     |j                   |                     |j                   dS )zU
        An rport setting of None should insert the parameter with no value.
        r   Nr   r   )r   r   r/   r2   r   r   r   r   r   s     r   
test_rportzViaTests.test_rportz  sh     GIT***'GHHH()))!,'''''r   c                 "   t          j        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   r   r/   r2   r   r   r   r   r   s     r   test_rportValuezViaTests.test_rportValue  s    
 GIQ''''IJJJ)***q)))!$$$$$r   c                    d}t          j        |          }|                     |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=12345r   10.0.0.1r   z	22.13.1.5i90  zrport=12345)r   r}   r/   r   r   r   receivedr   assertNotEqualr2   findr   s      r   testNATzViaTests.testNAT  s    Fq!!e,,,,,,&&&[111%(((AJJLL--m<<bAAAAAr   c                     d}t          j        |          }|                     |                                |           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/   r2   r   s      r   test_unknownParamszViaTests.test_unknownParams  s>     Nq!!q)))))r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r{   r{   *  s        > > >+ + +  4  &  ( ( (&( ( (	% 	% 	%	B 	B 	B* * * * *r   r{   c                       e Zd Zd Zd ZdS )URLTestsc                     dD ]<}|                      t          j        |                                          |           =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   parseURLr2   )r   urls     r   testRoundtripzURLTests.testRoundtrip  sR    
 	@ 	@C S\#..77993????	@ 	@r   c                     d}t          j        |          }dddddddd	d
dddgfddddffD ])\  }}|                     t          ||          |           *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)r   hosta)r   {   )r   udp)usertypephone)r0   rT   )r      )r   1.2.3.4otherblahzgoo=barr3   bd)arj   )r   r   r/   getattr)r   r   r   kr~   s        r   testComplexzURLTests.testComplex  s    8 	
 l1oo   ! vy)*c,,-
 	1 	1DAq WS!__a0000	1 	1r   N)r   r   r   r   r   r   r   r   r   r     s5        @ @ @1 1 1 1 1r   r   c                       e Zd Zd ZdS )
ParseTestsc           
      *   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 ]s\  }}}}t          j        |          \  }}}|                     ||           |                     |                                |           |                     ||           td S )Nz""A. G. Bell" <sip:foo@example.com>z
A. G. Bellzsip:foo@example.comzAnon <sip:foo@example.com>AnonrS   z<sip:foo@example.com>z)foo <sip:foo@example.com>;tag=bar;foo=bazrT   rU   baz)tagrT   )r   parseAddressr/   r2   )r   addressnameurlsparamsgnamegurlgparamss           r   testParseAddresszParseTests.testParseAddress  s     5%	 *63H"M"B(=rB$b*?D;%e,,	,
 	. 	.'GT4" $'#3G#<#< E4T5)))T]]__d333Wf----)	. 	.r   N)r   r   r   r   r   r   r   r   r     s#        . . . . .r   r   c                       e Zd Zd ZdS )DummyLocatorc                 R    t          j        t          j        dd                    S )N
server.comr   r   )r   succeedr   URLr   
logicalURLs     r   
getAddresszDummyLocator.getAddress  s!    }SW\===>>>r   Nr   r   r   r   r   r   r   r   r     s#        ? ? ? ? ?r   r   c                       e Zd Zd ZdS )FailingLocatorc                 B    t          j        t                                S r   )r   failLookupErrorr   s     r   r   zFailingLocator.getAddress  s    z+--(((r   Nr   r   r   r   r   r     s#        ) ) ) ) )r   r   c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )
ProxyTestsc                      t          j        d           _        t                       j        _        g  _         fd j        _        d S )N	127.0.0.1c                 <    j                             | |f          S r   sentr#   destmsgr   s     r   r   z"ProxyTests.setUp.<locals>.<lambda>      493C3CT3K3P3P r   )r   Proxyproxyr   locatorr   sendMessager%   s   `r   r&   zProxyTests.setUp  sB    Y{++
)^^
	!P!P!P!P
r   c                    t          j        dd          }|                    dt          j        d                                                     |                    dt          j        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;   rd   r   z1.2.3.5rT   rU   rA   <sip:joe@server.com>contactz<sip:joe@1.2.3.5>r   r   r.   r   r   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   ro   rp   r   r2   r   datagramReceivedr/   rD   r   r   r   r1   r0   r3   r   rr   r   r6   s       r   testRequestForwardzProxyTests.testRequestForward  s   K),,	E379--6688999	E379--6688999	E5!!!	D0111	I2333
##AJJLL2CDDDTY+++)A,aD)))L111))95558,,,Ie  	
 	
 	
 	
 	
r   c                    t          j        dd          }|                    dt          j        d                                                     |                    dd           |                    dd           |                    d	d
           | j                            |                                d           | j        d         \  }}|                     |j	        d         ddg           d S )Nr:   r;   rd   r   rT   rU   rA   r  r  z<sip:joe@1.2.3.4>z1.1.1.1r   r   r  z)SIP/2.0/UDP 1.2.3.4:5060;received=1.1.1.1)
r   ro   rp   r   r2   r   r  r   r/   r3   r  s       r   testReceivedRequestForwardz%ProxyTests.testReceivedRequestForward  s    K),,	E379--6688999	E5!!!	D0111	I2333
##AJJLL2CDDD)A,aIe)+VW	
 	
 	
 	
 	
r   c                 L   t          j        d          }|                    dt          j        d                                                     | j                            |                                d           |                     t          | j	                  d           d S )Nr\   rd   foo.comr  r   )
r   ru   rp   r   r2   r   r  r/   rD   r   rq   s     r   testResponseWrongViazProxyTests.testResponseWrongVia  s    L	E379--6688999
##AJJLL2CDDDTY+++++r   c                    t          j        d          }|                    dt          j        d                                                     |                    dt          j        dd                                                     | j                            |                                d           |                     t          | j	                  d           | j	        d	         \  }}|                     |j
        |j        fd
           |                     |j        d           |                     |j        d         dg           d S )Nr\   rd   r   
client.com  r   r  r.   r   )r  r  zSIP/2.0/UDP client.com:1234)r   ru   rp   r   r2   r   r  r/   rD   r   r   r   r_   r3   r  s       r   testResponseForwardzProxyTests.testResponseForward  s   L	E37;//88::;;;	E37<d;;;DDFFGGG
##AJJLL2CDDDTY+++)A,a$)TY/1EFFF%%%5),I+JKKKKKr   c                 (   t          j        d          }|                    dt          j        d                                                     |                    dt          j        dd                                                     | j                            |                                d           |                     t          | j	                  d           | j	        d	         \  }}|                     |j
        |j        fd
           d S )Nr\   rd   r   r   r  )r   r  r.   r   r  r   )r   ru   rp   r   r2   r   r  r/   rD   r   r   r   r  s       r   testReceivedResponseForwardz&ProxyTests.testReceivedResponseForward$  s    L	E37;//88::;;;	E37:EEENNPPQQQ
##AJJLL2CDDDTY+++)A,a$)TY/1EFFFFFr   c                 *   t          j        d          }|                    dt          j        d                                                     g fd| j        _        | j                            |                                d           |                     t                    d           d         \  }}|                     t          |j
                            dg                     d           |                     |j        d           d S )Nr\   rd   r   c                  .                         |           S r   )r#   )r   r!   s    r   r   z-ProxyTests.testResponseToUs.<locals>.<lambda>1  s    AHHQKK r   r  r.   r   )r   ru   rp   r   r2   r   gotResponser  r/   rD   r3   getr_   )r   rr   r6   addrr!   s       @r   testResponseToUszProxyTests.testResponseToUs-  s    L	E37;//88::;;;!7!7!7!7

##AJJLL2CDDDQ###A$4QY]]5"5566:::%%%%%r   c                    t          j        dd          }|                    dt          j        d                                                     |                    dt          j        d                                                     | j                            |                                d           |                     | j        g            d S )Nr:   r;   rd   r   r   r  )	r   ro   rp   r   r2   r   r  r/   r   rq   s     r   testLoopzProxyTests.testLoop8  s    K),,	E379--6688999	E37;//88::;;;
##AJJLL2FGGGB'''''r   c                    t          j        dd          }|                    dt          j        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;   rd   r   rA   r  r  r.   r   i  r  )r   ro   rp   r   r2   r   r   r   r  r/   rD   r   r   r   r_   r3   r  s       r   testCantForwardRequestz!ProxyTests.testCantForwardRequest?  s   K),,	E379--6688999	D0111+--

##AJJLL2CDDDTY+++)A,a$)TY/1BCCC%%%5),F+GHHHHHr   N)r   r   r   r&   r	  r  r  r  r  r  r  r   r   r   r   r   r     s        Q Q Q
 
 
.
 
 
, , ,	L 	L 	LG G G	& 	& 	&( ( (
I 
I 
I 
I 
Ir   r   c                   V    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZdS )RegistrationTestsc                      t          j        d           _        t          j        d           _         j        x j        _         j        _        g  _         fd j        _        d S )Nr   r   bell.example.comc                 <    j                             | |f          S r   r   r   s     r   r   z)RegistrationTests.setUp.<locals>.<lambda>R  r   r   )r   RegisterProxyr   InMemoryRegistryregistryr   r   r   r%   s   `r   r&   zRegistrationTests.setUpM  sa    &K888
,-?@@37=@
dj0	!P!P!P!P
r   c                 z    | j         j                                        D ]\  }}|                                 | `d S r   )r)  usersvaluescancelr   )r   r   r1   s      r   tearDownzRegistrationTests.tearDownT  s>    m)0022 	 	FAsHHJJJJJJJr   c                 V   t          j        dd          }|                    dd           |                    dd           |                    dt          j        d                                                     | j                            |                                d	           d S )
NREGISTERsip:bell.example.comrA   sip:joe@bell.example.comr  sip:joe@client.com:1234rd   r  r  r   ro   rp   r   r2   r   r  rq   s     r   registerzRegistrationTests.registerY  s    K
$:;;	D4555	I8999	E37<0099;;<<<
##AJJLL2FGGGGGr   c                    t          j        dd          }|                    dd           |                    dd           |                    dt          j        d                                                     |                    d	d
           | j                            |                                d           d S )Nr0  r1  rA   r2  r  *rd   r  expiresrR   r  r4  rq   s     r   
unregisterzRegistrationTests.unregister`  s    K
$:;;	D4555	Is###	E37<0099;;<<<	Is###
##AJJLL2FGGGGGr   c                    |                                   | j        d         \  }}|                     |j        |j        fd           |                     |j        d           |                     |j        d         dg           |                     |j        d         dg           |                     |j        d         d	g           t          t                    t          k    r5| 
                    t          |j        d
         d                   dv            |                     t          | j        j                  d           | j        j        d         \  }}|                     |                                d	           | j        j                            t'          j        dd                    }|                    d            |                    | j        d           |S )Nr   r  r\   rd   SIP/2.0/UDP client.com:5060rA   r2  r  sip:joe@client.com:5060r8  )i  i  i  i  r.   r=   r%  r   r   c                     | j         | j        fS r   r   r   )desturls    r   r   z0RegistrationTests.testRegister.<locals>.<lambda>{  s    w|W\&B r   )r5  r   r/   r   r   r_   r3   typer   r	   r   intrD   r)  r+  r2   r   r   r   r   r   addCallback)r   r   r6   dcr1   r   s         r   testRegisterzRegistrationTests.testRegisterh  s   )A,a$)TY/1EFFF%%%5),I+JKKK4+E*FGGG9-0I/JKKK ==222OOC	) 4Q 788<TTUUUT]0111555-%e,C)BCCCJ))GU);<<<
 
 	
BBCCC	d&(<===r   c                 @   |                                   |                                  | 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  r\   rd   r;  rA   r2  r  r<  r8  rR   )
r5  r9  r   r/   r   r   r_   r3   r)  r+  r   r   r6   s      r   testUnregisterz RegistrationTests.testUnregister  s   )A,a$)TY/1EFFF%%%5),I+JKKK4+E*FGGG9-0I/JKKK9-u555,b11111r   c                     t                      }t          j        |          }t          j                    }|                    dd           |                    |           || j        _        d S )NzuserXname@127.0.0.1	passXword)r   r   Portalr   'InMemoryUsernamePasswordDatabaseDontUseaddUserregisterCheckerr   )r   rr   prj   s       r   	addPortalzRegistrationTests.addPortal  sa    KKM!<>>			'555	!
r   c                 V   |                                   |                                  |                     t          | j        j                  d           |                     t          | j                  d           | j        d         \  }}|                     |j        d           d S )Nr   r.   i  )rP  r5  r/   rD   r)  r+  r   r_   rG  s      r   testFailedAuthenticationz*RegistrationTests.testFailedAuthentication  s    T]0111555TY+++)A,a%%%%%r   c                    t          j        dd          }|                    dd           |                    dd           |                    dt          j        d                                                     | j                            |                                d	           |                     t          | j	                  d
           d S )Nr0  zsip:wrong.comrA   r2  r  r3  rd   r  r  r   
r   ro   rp   r   r2   r   r  r/   rD   r   rq   s     r   testWrongDomainRegisterz)RegistrationTests.testWrongDomainRegister  s    K
O44	D4555	I8999	E37<0099;;<<<
##AJJLL2FGGGTY+++++r   c                    t          j        dd          }|                    dd           |                    dd           |                    dt          j        d                                                     | j                            |                                d	           |                     t          | j	                  d
           d S )Nr0  r1  rA   zsip:joe@foo.comr  r3  rd   r  r  r   rT  rq   s     r   testWrongToDomainRegisterz+RegistrationTests.testWrongToDomainRegister  s    K
$:;;	D+,,,	I8999	E37<0099;;<<<
##AJJLL2FGGGTY+++++r   c                     |                                   t          j        dd          }| j        j                            |          }|                     |t                     |S )Nr=   r  r=  r5  r   r   r   r   r   assertFailurer   r   r   r   s      r   testWrongDomainLookupz'RegistrationTests.testWrongDomainLookup  sV    gu9555J))#..1k***r   c                     |                                   t          j        dd          }| j        j                            |          }|                     |t                     |S )Njaner%  r=  rY  r[  s      r   testNoContactLookupz%RegistrationTests.testNoContactLookup  sW    gv,>???J))#..1k***r   N)r   r   r   r&   r.  r5  r9  rE  rH  rP  rR  rU  rW  r\  r_  r   r   r   r"  r"  L  s        Q Q Q  
H H HH H H  .
2 
2 
2  & & &, , ,, , ,      r   r"  c                       e Zd Zd Zd ZdS )Clientc                     t           j                            |            g | _        t	          j                    | _        d S r   )r   Base__init__r   r   Deferreddeferredr%   s    r   rd  zClient.__init__  s2    $((r   c                 x    | j                             |           | j                            | j                    d S r   )r   r#   rf  callback)r   responser  s      r   handle_responsezClient.handle_response  s6    X&&&t}-----r   N)r   r   r   rd  rj  r   r   r   ra  ra    s2        ) ) )
. . . . .r   ra  c                   &    e Zd Zd Zd Zd Zd ZdS )	LiveTestsc                    t          j        d          | _        t          j        d          | _        | j        x| j        _        | j        _        t          j        d| j        d          | _        t                      | _
        t          j        d| j
        d          | _        | j                                        j        | j                                        j        f| _        d S )Nr   r$  r%  r   )	interface)r   r'  r   r(  r)  r   r   	listenUDP
serverPortra  client
clientPortgetHostr   r   serverAddressr%   s    r   r&   zLiveTests.setUp  s    &K888
,-?@@37=@
dj0!+Atz[QQQhh!+At{kRRRO##%%*O##%%*
r   c                    | j         j                                        D ]\  }}|                                 t	          j        | j        j                  }t	          j        | j        j                  }t	          j	        ||g          S r   )
r)  r+  r,  r-  r   maybeDeferredrr  stopListeningrp  gatherResults)r   r   r1   d1d2s        r   r.  zLiveTests.tearDown  st    m)0022 	 	FAsHHJJJJ !>?? !>??"B8,,,r   c                      j                                         j        }t          j        dd          }|                    dd           |                    dd|z             |                    dt          j        d|	                                                      j        	                    t          j
        d j        d
                   |            j        j        } fd}|                    |           |S )Nr0  r1  rA   r2  r  sip:joe@127.0.0.1:%drd   r   r   r.   r?  c                                          t          |           d           | d         }                     |j        d           d S Nr.   r   r\   r/   rD   r_   r   rr   r   s     r   checkz%LiveTests.testRegister.<locals>.check  F    S]]A...AQVS)))))r   )rr  rs  r   r   ro   rp   r   r2   rq  r   r   rt  rf  rC  )r   rO  rr   r   r  s   `    r   rE  zLiveTests.testRegister  s    O##%%*K
$:;;	D4555	I59:::	E37;Q777@@BBCCCG4+=a+@AAA1	
 	
 	
 K 	* 	* 	* 	* 	*
 	
er   c                      j                                         j        }t          j        dd          }|                    dd           |                    dd|z             |                    dt          j        d|d	
                                                                           j	        g          } 
                    t          |          d            
                    |d         d         d            
                    |d         d         t                      j                            t          j        d j        d                   |            j        j        } f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.
        r0  r1  rA   r2  r  r|  rd   r   T)r   r   r   r.   r   r+   r   r   r?  c                                          t          |           d           | d         }                     |j        d           d S r~  r  r  s     r   r  z)LiveTests.test_amoralRPort.<locals>.check  r  r   )rr  rs  r   r   ro   rp   r   r2   r   test_amoralRPortr/   rD   r   rq  r   r   rt  rf  rC  )r   rO  rr   r   r   r  s   `     r   r  zLiveTests.test_amoralRPort  s    O##%%*K
$:;;	D4555	I59:::	E37;QdCCCLLNNOOO%%$:O9P%QQX***QK	"$Q	
 	
 	
 	!Z02DEEEG4+=a+@AAA1	
 	
 	
 K 	* 	* 	* 	* 	*
 	
er   N)r   r   r   r&   r.  rE  r  r   r   r   rl  rl    sP        

 

 

- - -  &    r   rl  ))rk   twisted.credr   r   twisted.internetr   r   twisted.protocolsr   twisted.trialr   twisted.internet.asyncioreactorr	   BaseExceptionzope.interfacer
   replacerC   rK   rN   rV   r^   rY   request_nattedre   r   TestCaser   rh   rm   r{   r   r   ILocatorr   r   r   r"  rc  ra  rl  r   r   r   <module>r     sv  
  * ) ) ) ) ) ) ) + + + + + + + + ! ! ! ! ! ! " " " " " ""FFFFFFF " " "!" ' & & & & &  	f	 		 	 	&	 		 	 7&  	 	&	 	 	(
 G&  
 	&	 	  G& 	  g&  (0 0 0 0 0 0 0 0
E
 E
 E
 E
 E
(+ E
 E
 E
P    ,?   A A A A Ax( A A A(u* u* u* u* u*x  u* u* u*p1 1 1 1 1x  1 1 1@. . . . ." . . .2 S\? ? ? ? ? ? ? ?
 S\) ) ) ) ) ) ) )
bI bI bI bI bI" bI bI bIJl l l l l) l l l^. . . . .SX . . .F F F F F! F F F F Fs   ' 11