+
    Dfjc                        R t ^ RIHtHt ^ RIHtHt ^ RIHt ^ RI	H
t
  ^ RIHt ^ RIHt RR	P!                  R
R4      ,           tRP!                  R
R4      tRP!                  R
R4      tRP!                  R
R4      tRP!                  R
R4      tRP!                  R
R4      tRP!                  R
R4      tRP!                  R
R4      t ! R R4      t ! R R]
P4                  4      t ! R R]4      t ! R R]
P4                  4      t ! R R]
P4                  4      t ! R R]
P4                  4      t ! R R ]
P4                  4      t ]! ]PB                  4       ! R! R"4      4       t"]! ]PB                  4       ! R# R$4      4       t# ! R% R&]
P4                  4      t$ ! R' R(]
P4                  4      t% ! R) R*]PL                  4      t' ! R+ R,]
P4                  4      t(R#   ] d    Rt ELi ; i)-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                   &   a  ] tR t^~t o R tRtV tR# )	TestRealmc                *    \         P                  R R 3# )Nc                      R # N r       7/usr/lib/python3/dist-packages/twisted/test/test_sip.py<lambda>)TestRealm.requestAvatar.<locals>.<lambda>   s    4r   )r   IContact)selfavatarIdmind
interfacess   &&&*r   requestAvatarTestRealm.requestAvatar   s    ||T<//r   r   N)__name__
__module____qualname____firstlineno__r   __static_attributes____classdictcell____classdict__s   @r   r   r   ~   s     0 0r   r   c                   \   a  ] tR t^t o R tR tR tR tR tR t	R t
R tR	 tR
 tRtV tR# )MessageParsingTestsc                r    . V n         \        P                  ! V P                   P                  4      V n        R # r   )lr   MessagesParserappendparserr   s   &r   setUpMessageParsingTests.setUp   s#    ((7r   c                p    V P                   P                  V4       V P                   P                  4        R # r   r*   dataReceiveddataDone)r   messages   &&r   feedMessageMessageParsingTests.feedMessage   s$      )r   c                :   V P                  VP                  V4       V P                  VP                  P                  4       V4       V P                  VP                  V4       V P                  VP
                  V4       V P                  VP                  ^4       R# )z
Validate Requests.
N)assertEqualmethoduritoStringheadersbodyfinished)r   mr7   r8   r:   r;   s   &&&&&&r   validateMessage#MessageParsingTests.validateMessage   so     	6*)3/G,&Q'r   c                    V P                   pV P                  \        4       V P                  \	        V4      ^4       V P                  V^ ,          RRRR.RR.RR./R	4       R
#    INVITEsip:foofrommotojoecontent-length4abcdN)r'   r3   request1r6   lenr>   r   r'   s   & r   
testSimpleMessageParsingTests.testSimple   b    FF"Q#aDdVTE7,<seD	
r   c                6   V P                   pV P                  \        4       V P                  \        4       V P	                  \        V4      ^4       V P                  V^ ,          RRRR.RR.RR./R	4       V P                  V^,          RRRR.RR./R
4       R# )   rC   rD   rE   rF   rG   rH   rI   rJ   rK   1234N)r'   r3   rL   request2r6   rM   r>   rN   s   & r   testTwoMessages#MessageParsingTests.testTwoMessages   s    FF""Q#aDdVTE7,<seD	
 	aD(Iug'F	
r   c                    V P                   pV P                  \        4       V P                  \	        V4      ^4       V P                  V^ ,          RRRR.RR.RR./R	4       R
# )rB   rC   rD   rE   rF   rG   rH   rI   rJ   rT   N)r'   r3   request3r6   rM   r>   rN   s   & r   testGarbageMessageParsingTests.testGarbage   rQ   r   c                \   V P                   pV P                  \        4       V P                  \	        V4      ^4       V P                  V^ ,          RRRR.RR.RR./R	4       V P                  V^,          RR
RR.RR.RR./R4       V P                  V^,          RR
RR.RR.RR./R4       R# )   rC   rD   rE   rF   rG   rH   rI   0 zsip:loopfoobarrJ   rK   rT   N)r'   r3   request4r6   rM   r>   rN   s   & r   testThreeInOne"MessageParsingTests.testThreeInOne   s    FF"Q#aDdVTE7,<seD	
 	aDeWdUG-=uE	
 	aDeWdUG-=uE	
r   c                    V P                   pV P                  \        4       V P                  \	        V4      ^4       V P                  V^ ,          RRRR.RR.RR./R	4       R
# rA   )r'   r3   request_shortr6   rM   r>   rN   s   & r   	testShortMessageParsingTests.testShort   sb    FF'Q#aDdVTE7,<seD	
r   c           	        V P                   pV P                  \        4       V P                  \	        V4      ^4       V^ ,          pV P                  VP
                  ^4       V P                  VP                  R4       V P                  VP                  RR.RR.RR./4       V P                  VP                  R4       V P                  VP                  ^4       R	# )
rB   OKrE   r`   rG   ra   rI   r^   r_   N)
r'   r3   	response1r6   rM   codephraser:   r;   r<   r   r'   r=   s   &  r   testSimpleResponse&MessageParsingTests.testSimpleResponse   s    FF#Q#aD%4(IIw8H3%P	
 	$Q'r   c                   V P                   pV P                  \        4       V P                  \	        V4      ^4       V^ ,          pV P                  VP
                  R,          ^ ,          R4       V P                  VP
                  R,          ^,          R4       V P                  VP
                  R,          ^,          R4       R# )z^
A header may be split across multiple lines.  Subsequent lines begin
with C{" "} or C{"\t"}.
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.2zHSIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.1N)r'   r3   response_multiliner6   rM   r:   rn   s   &  r   test_multiLine"MessageParsingTests.test_multiLine   s    
 FF+,Q#aDIIeQ7	

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

 	IIeQ:	
r   )r'   r*   N)r   r   r   r   r,   r3   r>   rO   rV   rZ   rc   rg   ro   rt   r    r!   r"   s   @r   r%   r%      s<     8(


 


4

(
 
r   r%   c                   *   a  ] tR tRt o RtR tRtV tR# )%MessageParsingFeedDataCharByCharTestsi  z1
Same as base class, but feed data char by char.
c                    V F  pV P                   P                  V4       K   	  V P                   P                  4        R # r   r/   )r   r2   cs   && r   r3   1MessageParsingFeedDataCharByCharTests.feedMessage  s.    AKK$$Q' r   r   N)r   r   r   r   __doc__r3   r    r!   r"   s   @r   rw   rw     s      r   rw   c                   2   a  ] tR tRt o R tR tR tRtV tR# )MakeMessageTestsi  c                    \         P                  ! R R4      pVP                  RR4       V P                  VP	                  4       R4       R# )rC   rD   r`   ra   z$INVITE sip:foo SIP/2.0
Foo: bar

N)r   Request	addHeaderr6   r9   r   rs   & r   testRequestMakeMessageTests.testRequest  s7    KK),	E5!'STr   c                    \         P                  ! ^R4      pVP                  RR4       VP                  RR4       VP                  R4       V P	                  VP                  4       R4       R# )	   rj   r`   ra   zContent-LengthrJ   rT   z3SIP/2.0 200 OK
Foo: bar
Content-Length: 4

1234N)r   Responser   bodyDataReceivedr6   r9   r   s   & r   testResponseMakeMessageTests.testResponse  sW    LLd#	E5!	$c*	6"JJLW	
r   c                r    \         P                  ! ^4      pV P                  VP                  4       R4       R# )r   zSIP/2.0 200 OK

N)r   r   r6   r9   r   s   & r   testStatusCodeMakeMessageTests.testStatusCode%  s'    LL'?@r   r   N)	r   r   r   r   r   r   r   r    r!   r"   s   @r   r}   r}     s     U

A Ar   r}   c                   \   a  ] tR tRt o R tR tR tR tR tR t	R t
R	 tR
 tR tRtV tR# )ViaTestsi*  c                    VP                  4       pV P                  V\        P                  ! V4      P                  4       4       R # r   )r9   r6   r   parseViaHeader)r   vss   && r   checkRoundtripViaTests.checkRoundtrip+  s1    JJLC..q1::<=r   c                B   \         P                  ! R 4      p\         P                  ! R4      pV P                  VP                  VP                  4       V P                  VP                  VP                  4       V P                  VP
                  VP
                  4       R# )zSIP/2.0/UDP 192.168.1.1:5060z SIP/2.0/UDP     192.168.1.1:5060N)r   r   r6   	transporthostport)r   v1v2s   &  r   testExtraWhitespaceViaTests.testExtraWhitespace/  sl     >? BCr||4"''*"''*r   c                   Rp\         P                  ! V4      pV P                  VP                  R4       V P                  VP                  R4       V P                  VP
                  R4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  ^4       V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  ^ 4       V P                  VP                  4       R4       V P!                  V4       R# )	z3
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
a7c6a8dlzezKSIP/2.0/UDP first.example.com:4000;ttl=16;branch=a7c6a8dlze;maddr=224.2.0.1N)r   r   r6   r   r   r   assertIsNonerport
rportValueassertFalserportRequestedttlmaddrbranchhiddenr9   r   r   r   r   s   &  r   test_complexViaTests.test_complex6  s   
, 	
 q!e,!45&!''"!,,'))*#+.<01%JJL8	

 	Ar   c                   Rp\         P                  ! V4      pV P                  VP                  R4       V P                  VP                  R4       V P                  VP
                  R4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP!                  4       R4       V P#                  V4       R# )z#
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   r6   r   r   r   r   r   r   r   r   r   r   r   
assertTruer   r9   r   r   s   &  r   test_simpleViaTests.test_simpleP  s     -q!e,/&!''"!,,'))*!%% !''"!((#!'LMAr   c                T    \         P                  ! R 4      pV P                  V4       R# )r   N)r   Viar   r   r   s   & r   testSimplerViaTests.testSimplerc  s    GGM"Ar   c                   \         P                  ! RRR7      pV P                  V P                  .R7      pV P	                  \        V4      ^4       V P	                  V^ ,          R,          R4       V P	                  V^ ,          R,          \        4       V P	                  VP                  4       R4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       R	# )
zd
Setting rport to True is deprecated, but still produces a Via header
with the expected properties.
foo.barTr   offendingFunctionsr2   +rport=True is deprecated since Twisted 9.0.categorySIP/2.0/UDP foo.bar:5060;rportN)r   r   flushWarningstest_deprecatedRPortr6   rM   DeprecationWarningr9   r   r   r   r   r   )r   r   warningss   &  r   r   ViaTests.test_deprecatedRPortg  s    
 GGIT*%%$:S:S9T%UX*QK	"$Q	
 	!Z02DE'GH (()!,,'r   c                    \         P                  ! RRR7      pV P                  VP                  4       R4       V P	                  VP
                  4       V P                  VP                  4       R# )zE
An rport setting of None should insert the parameter with no value.
r   Nr   r   )r   r   r6   r9   r   r   r   r   r   s   & r   
test_rportViaTests.test_rportz  sO     GGIT*'GH(()!,,'r   c                   \         P                  ! R^R7      pV P                  VP                  4       R4       V P	                  VP
                  4       V P                  VP                  ^4       V P                  VP                  ^4       R# )zS
An rport numeric setting should insert the parameter with the number
value given.
r   r   z SIP/2.0/UDP foo.bar:5060;rport=1N)r   r   r6   r9   r   r   r   r   r   s   & r   test_rportValueViaTests.test_rportValue  sg    
 GGIQ''IJ))*q)!$r   c                   R p\         P                  ! V4      pV P                  VP                  R4       V P                  VP                  R4       V P                  VP
                  R4       V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  4       P                  R4      R4       R# )	z8SIP/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=12345N)r   r   r6   r   r   r   receivedr   assertNotEqualr9   findr   s   &  r   testNATViaTests.testNAT  s    Fq!e,,&[1%(AJJL--m<bAr   c                v    Rp\         P                  ! V4      pV P                  VP                  4       V4       R# )zJ
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   r6   r9   r   s   &  r   test_unknownParamsViaTests.test_unknownParams  s0     Nq!q)r   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   s   @r   r   r   *  s=     >+4&(&(	%	B* *r   r   c                   ,   a  ] tR tRt o R tR tRtV tR# )URLTestsi  c                    R F7  pV P                  \        P                  ! V4      P                  4       V4       K9  	  R# )sip:j.doe@big.comN)r   z&sip:j.doe:secret@big.com;transport=tcpz!sip:j.doe@big.com?subject=projectzsip:example.com)r6   r   parseURLr9   )r   urls   & r   testRoundtripURLTests.testRoundtrip  s2    
C S\\#.7793?
r   c                    R p\         P                  ! V4      pR
RRRRRRRRRRR.3RRRRR/33 F   w  r4V P                  \        W#4      V4       K"  	  R	# )zesip:user:pass@hosta:123;transport=udp;user=phone;method=foo;ttl=12;maddr=1.2.3.4;blah;goo=bar?a=b&c=dotherblahzgoo=barr:   abry   dN)usernameuser)passwordpass)r   hosta)r   {   )r   udp)usertypephone)r7   r`   )r      )r   1.2.3.4)r   r   r6   getattr)r   r   r   kr   s   &    r   testComplexURLTests.testComplex  sx    8 	
 ll1o   ! vy)*c3,-
DA WS_a0
r   r   N)r   r   r   r   r   r   r    r!   r"   s   @r   r   r     s     @1 1r   r   c                   &   a  ] tR tRt o R tRtV tR# )
ParseTestsi  c                   R RR/ 3RRR/ 3RRR/ 3RRR/ 3RRRR	R
RR/33 Fa  w  rr4\         P                  ! V4      w  rVpV P                  W%4       V P                  VP                  4       V4       V P                  Wt4       Kc  	  R# )z""A. G. Bell" <sip:foo@example.com>z
A. G. Bellzsip:foo@example.comzAnon <sip:foo@example.com>Anonr_   z<sip:foo@example.com>z)foo <sip:foo@example.com>;tag=bar;foo=bazr`   tagra   bazN)r   parseAddressr6   r9   )r   addressnameurlsparamsgnamegurlgparamss   &       r   testParseAddressParseTests.testParseAddress  s     5%	 *63H"M"B(=rB$b*?D;%ue,	,
'G4" $'#3#3G#< ET)T]]_d3W-),
r   r   N)r   r   r   r   r  r    r!   r"   s   @r   r   r     s     . .r   r   c                   &   a  ] tR tRt o R tRtV tR# )DummyLocatori  c                Z    \         P                  ! \        P                  ! R RR7      4      # )
server.comr   r   )r   succeedr   URLr   
logicalURLs   &&r   
getAddressDummyLocator.getAddress  s    }}SWW\=>>r   r   Nr   r   r   r   r  r    r!   r"   s   @r   r  r    s     ? ?r   r  c                   &   a  ] tR tRt o R tRtV tR# )FailingLocatori  c                >    \         P                  ! \        4       4      # r   )r   failLookupErrorr
  s   &&r   r  FailingLocator.getAddress  s    zz+-((r   r   Nr  r"   s   @r   r  r    s     ) )r   r  c                   V   a  ] tR tRt o R tR tR tR tR tR t	R t
R	 tR
 tRtV tR# )
ProxyTestsi  c                   a  \         P                  ! R 4      S n        \        4       S P                  n        . S n        V 3R lS P                  n        R# )	127.0.0.1c                 <   < SP                   P                  W34      # r   sentr)   destmsgr   s   &&r   r   "ProxyTests.setUp.<locals>.<lambda>      4993C3CTK3Pr   N)r   Proxyproxyr  locatorr  sendMessager+   s   fr   r,   ProxyTests.setUp  s4    YY{+
)^

	!P

r   c                ~   \         P                  ! R R4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  R\         P                  ! R4      P	                  4       4       VP                  RR4       VP                  RR4       VP                  R	R
4       V P
                  P                  VP	                  4       R4       V P                  \        V P                  4      ^4       V P                  ^ ,          w  r#V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  P	                  4       R4       V P                  VP                  R 4       V P                  VP                  R,          . RO4       R# )rC   rD   rr   r   z1.2.3.5r`   ra   rG   <sip:joe@server.com>contactz<sip:joe@1.2.3.5>r   r  N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   r   r   r   r9   r"  datagramReceivedr6   rM   r  r   r   r8   r7   r:   r   r   r  r=   s   &   r   testRequestForwardProxyTests.testRequestForward  s6   KK),	E3779-6689	E3779-6689	E5!	D01	I23

##AJJL2CDTYY+))A,D)L1)958,IIe	
r   c                   \         P                  ! R R4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  RR4       VP                  RR4       VP                  RR	4       V P
                  P                  VP	                  4       R4       V P                  ^ ,          w  r#V P                  VP                  R,          R
R.4       R# )rC   rD   rr   r   r`   ra   rG   r'  r(  z<sip:joe@1.2.3.4>r*  z)SIP/2.0/UDP 1.2.3.4:5060;received=1.1.1.1Nz1.1.1.1r   )
r   r   r   r   r9   r"  r,  r  r6   r:   r-  s   &   r   testReceivedRequestForward%ProxyTests.testReceivedRequestForward  s    KK),	E3779-6689	E5!	D01	I23

##AJJL2CD))A,IIe)+VW	
r   c                8   \         P                  ! ^4      pVP                  R\         P                  ! R4      P	                  4       4       V P
                  P                  VP	                  4       R4       V P                  \        V P                  4      ^ 4       R# )r   rr   foo.comNr1  )
r   r   r   r   r9   r"  r,  r6   rM   r  r   s   & r   testResponseWrongViaProxyTests.testResponseWrongVia  sc    LL	E3779-6689

##AJJL2CDTYY+r   c                   \         P                  ! ^4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  R\         P                  ! RRR7      P	                  4       4       V P
                  P                  VP	                  4       R4       V P                  \        V P                  4      ^4       V P                  ^ ,          w  r#V P                  VP                  VP                  3R	4       V P                  VP                  ^4       V P                  VP                  R,          R.4       R# )
r   rr   r  
client.com  r  zSIP/2.0/UDP client.com:1234Nr1  )r9  r:  )r   r   r   r   r9   r"  r,  r6   rM   r  r   r   rl   r:   r-  s   &   r   testResponseForwardProxyTests.testResponseForward  s    LL	E377;/88:;	E377<d;DDFG

##AJJL2CDTYY+))A,$))TYY/1EF%5),I+JKr   c                   \         P                  ! ^4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  R\         P                  ! RRR7      P	                  4       4       V P
                  P                  VP	                  4       R4       V P                  \        V P                  4      ^4       V P                  ^ ,          w  r#V P                  VP                  VP                  3R4       R# )	r   rr   r  r   r9  )r   Nr1  r9  r   )r   r   r   r   r9   r"  r,  r6   rM   r  r   r   r-  s   &   r   testReceivedResponseForward&ProxyTests.testReceivedResponseForward$  s    LL	E377;/88:;	E377:ENNPQ

##AJJL2CDTYY+))A,$))TYY/1EFr   c                  a \         P                  ! ^4      pVP                  R\         P                  ! R4      P	                  4       4       . oV3R lV P
                  n        V P
                  P                  VP	                  4       R4       V P                  \        S4      ^4       S^ ,          w  r#V P                  \        VP                  P                  R. 4      4      ^ 4       V P                  VP                  ^4       R# )r   rr   r  c                  &   < SP                  V 4      # r   )r)   )r   r'   s   *r   r   -ProxyTests.testResponseToUs.<locals>.<lambda>1  s    AHHQKr   Nr1  )r   r   r   r   r9   r"  gotResponser,  r6   rM   r:   getrl   )r   r   r=   addrr'   s   &   @r   testResponseToUsProxyTests.testResponseToUs-  s    LL	E377;/88:;!7



##AJJL2CDQ#A$QYY]]5"56:%r   c                   \         P                  ! R R4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  R\         P                  ! R4      P	                  4       4       V P
                  P                  VP	                  4       R4       V P                  V P                  . 4       R# )rC   rD   rr   r   r  Nr>  )	r   r   r   r   r9   r"  r,  r6   r  r   s   & r   testLoopProxyTests.testLoop8  s    KK),	E3779-6689	E377;/88:;

##AJJL2FGB'r   c                   \         P                  ! R R4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  RR4       \        4       V P                  n        V P                  P                  VP	                  4       R	4       V P                  \        V P                  4      ^4       V P                  ^ ,          w  r#V P                  VP                  VP                  3R	4       V P                  VP                  R4       V P                  VP                  R,          R.4       R# )
rC   rD   rr   r   rG   r'  i  r+  Nr)  )r   r   r   r   r9   r  r"  r#  r,  r6   rM   r  r   r   rl   r:   r-  s   &   r   testCantForwardRequest!ProxyTests.testCantForwardRequest?  s    KK),	E3779-6689	D01+-



##AJJL2CDTYY+))A,$))TYY/1BC%5),F+GHr   )r"  r  N)r   r   r   r   r,   r.  r2  r6  r;  r?  rG  rJ  rM  r    r!   r"   s   @r   r  r    s<     Q
.
,	LG	&(
I 
Ir   r  c                   h   a  ] tR tRt o R tR tR tR tR tR t	R t
R	 tR
 tR tR tR tRtV tR# )RegistrationTestsiL  c                  a  \         P                  ! R R7      S n        \         P                  ! R4      S n        S P                  ;S P                  n        S P                  n        . S n        V 3R lS P                  n        R# )r  r   bell.example.comc                 <   < SP                   P                  W34      # r   r  r  s   &&r   r   )RegistrationTests.setUp.<locals>.<lambda>R  r   r   N)r   RegisterProxyr"  InMemoryRegistryregistryr#  r  r$  r+   s   fr   r,   RegistrationTests.setUpM  sW    &&K8
,,-?@37==@

djj0	!P

r   c                    V P                   P                  P                  4        F  w  rVP                  4        K  	  V =R # r   )rX  usersvaluescancelr"  )r   r   r8   s   &  r   tearDownRegistrationTests.tearDownT  s/    mm))002FAHHJ 3Jr   c                8   \         P                  ! R R4      pVP                  RR4       VP                  RR4       VP                  R\         P                  ! R4      P	                  4       4       V P
                  P                  VP	                  4       R	4       R# )
REGISTERsip:bell.example.comrG   sip:joe@bell.example.comr(  sip:joe@client.com:1234rr   r9  Nr>  r   r   r   r   r9   r"  r,  r   s   & r   registerRegistrationTests.registerY  sl    KK
$:;	D45	I89	E377<099;<

##AJJL2FGr   c                \   \         P                  ! R R4      pVP                  RR4       VP                  RR4       VP                  R\         P                  ! R4      P	                  4       4       VP                  RR	4       V P
                  P                  VP	                  4       R4       R
# )ra  rb  rG   rc  r(  *rr   r9  expiresr^   Nr>  re  r   s   & r   
unregisterRegistrationTests.unregister`  sy    KK
$:;	D45	Is#	E377<099;<	Is#

##AJJL2FGr   c                   V P                  4        V P                  ^ ,          w  rV P                  VP                  VP                  3R4       V P                  VP
                  ^4       V P                  VP                  R,          R.4       V P                  VP                  R,          R.4       V P                  VP                  R,          R.4       \        \        4      \        8w  d6   V P                  \        VP                  R,          ^ ,          4      R9   4       V P                  \        V P                  P                  4      ^4       V P                  P                  R,          w  r4V P                  VP                  4       R4       V P                   P"                  P%                  \&        P(                  ! RR	R
7      4      pVP+                  R 4       VP+                  V P                  R4       V# )    rr   SIP/2.0/UDP client.com:5060rG   rc  r(  sip:joe@client.com:5060rj  rH   rS  r   r   c                 2    V P                   V P                  3# r   r   r   )desturls   &r   r   0RegistrationTests.testRegister.<locals>.<lambda>{  s    w||W\\&Br   r>  )i  i  i  i  )rf  r  r6   r   r   rl   r:   typer   r   r   intrM   rX  r[  r9   r"  r#  r  r   r	  addCallback)r   r  r=   dcr8   r   s   &     r   testRegisterRegistrationTests.testRegisterh  st   ))A,$))TYY/1EF%5),I+JK4+E*FG9-0I/JK =22OOC		) 4Q 78<TTUT]]00115--%%e,)BCJJ))GGU);<
 	
BC	d&&(<=r   c                d   V P                  4        V P                  4        V P                  ^,          w  rV P                  VP                  VP
                  3R
4       V P                  VP                  ^4       V P                  VP                  R,          R.4       V P                  VP                  R,          R.4       V P                  VP                  R,          R.4       V P                  VP                  R,          R.4       V P                  V P                  P                  / 4       R	# )rB   rr   ro  rG   rc  r(  rp  rj  r^   Nr>  )
rf  rk  r  r6   r   r   rl   r:   rX  r[  r   r  r=   s   &  r   testUnregister RegistrationTests.testUnregister  s    ))A,$))TYY/1EF%5),I+JK4+E*FG9-0I/JK9-u5,,b1r   c                    \        4       p\        P                  ! V4      p\        P                  ! 4       pVP                  R R4       VP                  V4       W P                  n        R# )zuserXname@127.0.0.1	passXwordN)r   r   Portalr   'InMemoryUsernamePasswordDatabaseDontUseaddUserregisterCheckerr"  )r   r   pry   s   &   r   	addPortalRegistrationTests.addPortal  sL    KMM!<<>			'5	!

r   c                P   V P                  4        V P                  4        V P                  \        V P                  P
                  4      ^ 4       V P                  \        V P                  4      ^4       V P                  ^ ,          w  rV P                  VP                  R4       R# )rn  i  N)r  rf  r6   rM   rX  r[  r  rl   r}  s   &  r   testFailedAuthentication*RegistrationTests.testFailedAuthentication  so    T]]00115TYY+))A,%r   c                   \         P                  ! R R4      pVP                  RR4       VP                  RR4       VP                  R\         P                  ! R4      P	                  4       4       V P
                  P                  VP	                  4       R	4       V P                  \        V P                  4      ^ 4       R# )
ra  zsip:wrong.comrG   rc  r(  rd  rr   r9  Nr>  
r   r   r   r   r9   r"  r,  r6   rM   r  r   s   & r   testWrongDomainRegister)RegistrationTests.testWrongDomainRegister  s    KK
O4	D45	I89	E377<099;<

##AJJL2FGTYY+r   c                   \         P                  ! R R4      pVP                  RR4       VP                  RR4       VP                  R\         P                  ! R4      P	                  4       4       V P
                  P                  VP	                  4       R	4       V P                  \        V P                  4      ^ 4       R# )
ra  rb  rG   zsip:joe@foo.comr(  rd  rr   r9  Nr>  r  r   s   & r   testWrongToDomainRegister+RegistrationTests.testWrongToDomainRegister  s    KK
$:;	D+,	I89	E377<099;<

##AJJL2FGTYY+r   c                    V P                  4        \        P                  ! R RR7      pV P                  P                  P                  V4      pV P                  V\        4       V# )rH   r5  rq  rf  r   r	  r"  r#  r  assertFailurer  r   r   r   s   &  r   testWrongDomainLookup'RegistrationTests.testWrongDomainLookup  sJ    ggu95JJ))#.1k*r   c                    V P                  4        \        P                  ! R RR7      pV P                  P                  P                  V4      pV P                  V\        4       V# )janerS  rq  r  r  s   &  r   testNoContactLookup%RegistrationTests.testNoContactLookup  sK    ggv,>?JJ))#.1k*r   )r"  rX  r  N)r   r   r   r   r,   r^  rf  rk  rz  r~  r  r  r  r  r  r  r    r!   r"   s   @r   rP  rP  L  sI     Q
HH.
2&,, r   rP  c                   ,   a  ] tR tRt o R tR tRtV tR# )Clienti  c                    \         P                  P                  V 4       . V n        \        P
                  ! 4       V n        R # r   )r   Base__init__r   r   Deferreddeferredr+   s   &r   r  Client.__init__  s)    $(r   c                    V P                   P                  V4       V P                  P                  V P                   4       R # r   )r   r)   r  callback)r   responserF  s   &&&r   handle_responseClient.handle_response  s*    X&t}}-r   )r  r   N)r   r   r   r   r  r  r    r!   r"   s   @r   r  r    s     )
. .r   r  c                   8   a  ] tR tRt o R tR tR tR tRtV t	R# )	LiveTestsi  c                $   \         P                  ! R R7      V n        \         P                  ! R4      V n        V P                  ;V P                  n        V P                  n        \        P                  ! ^ V P                  R R7      V n        \        4       V n
        \        P                  ! ^ V P                  R R7      V n        V P                  P                  4       P                  V P                  P                  4       P                  3V n        R# )r  rR  rS  )	interfaceN)r   rV  r"  rW  rX  r#  r   	listenUDP
serverPortr  client
clientPortgetHostr   r   serverAddressr+   s   &r   r,   LiveTests.setUp  s    &&K8
,,-?@37==@

djj0!++Atzz[Qh!++At{{kROO##%**OO##%**
r   c                R   V P                   P                  P                  4        F  w  rVP                  4        K  	  \        P
                  ! V P                  P                  4      p\        P
                  ! V P                  P                  4      p\        P                  ! W4.4      # r   )
rX  r[  r\  r]  r   maybeDeferredr  stopListeningr  gatherResults)r   r   r8   d1d2s   &    r   r^  LiveTests.tearDown  sq    mm))002FAHHJ 3  !>!>?  !>!>?""B8,,r   c                   a  S P                   P                  4       P                  p\        P                  ! R R4      pVP                  RR4       VP                  RRV,          4       VP                  R\        P                  ! RVR7      P                  4       4       S P                  P                  \        P                  ! RS P                  ^,          R	7      V4       S P                  P                  pV 3R
 lpVP                  V4       V# )ra  rb  rG   rc  r(  sip:joe@127.0.0.1:%drr   r  r  rs  c                    < SP                  \        V 4      ^4       V ^ ,          pSP                  VP                  ^4       R# rB   Nr6   rM   rl   r   r   r   s   & r   check%LiveTests.testRegister.<locals>.check  4    S]A.AQVVS)r   )r  r  r   r   r   r   r   r9   r  r$  r	  r  r  rx  )r   r  r   r   r  s   f    r   rz  LiveTests.testRegister  s    OO##%**KK
$:;	D45	I59:	E377;Q7@@BCGG4+=+=a+@A1	
 KK  	*
 	
er   c           	       a  S P                   P                  4       P                  p\        P                  ! RR4      pVP                  RR4       VP                  RRV,          4       VP                  R\        P                  ! RVR	R
7      P                  4       4       S P                  S P                  .R7      pS P                  \        V4      ^4       S P                  V^ ,          R,          R4       S P                  V^ ,          R,          \        4       S P                  P                  \        P                  ! RS P                   ^,          R7      V4       S P                  P"                  pV 3R lpVP%                  V4       V# )a8  
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.
ra  rb  rG   rc  r(  r  rr   r  T)r   r   r   r2   r   r   rs  c                    < SP                  \        V 4      ^4       V ^ ,          pSP                  VP                  ^4       R# r  r  r  s   & r   r  )LiveTests.test_amoralRPort.<locals>.check  r  r   )r  r  r   r   r   r   r   r9   r   test_amoralRPortr6   rM   r   r  r$  r	  r  r  rx  )r   r  r   r   r   r  s   f     r   r  LiveTests.test_amoralRPort  s4    OO##%**KK
$:;	D45	I59:	E377;QdCLLNO%%$:O:O9P%QX*QK	"$Q	
 	!Z02DEGG4+=+=a+@A1	
 KK  	*
 	
er   )r  r  r"  rX  r  r  N)
r   r   r   r   r,   r^  rz  r  r    r!   r"   s   @r   r  r    s     

-& r   r  ))r{   twisted.credr   r   twisted.internetr   r   twisted.protocolsr   twisted.trialr   twisted.internet.asyncioreactorr   BaseExceptionzope.interfacer	   replacerL   rU   rY   rb   rk   rf   request_nattedrs   r   TestCaser%   rw   r}   r   r   r   ILocatorr  r  r  rP  r  r  r  r   r   r   <module>r     s-  
 * + ! ""F '  	f		 	 	&		 	 7& 	 	&	 	(
 G& 
 	&	  G&	  g& (0 0
E
(++ E
P,? Ax(( A(u*x   u*p1x   1@."" .2 S\\? ? ?
 S\\) ) )
bI"" bIJl)) l^.SXX .F!! Fm  "!"s   G 	G"!G"