ó
    ×›‘hÂb  ã                   ó¬   • S r SSKJrJrJrJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJrJrJrJr  SSKJr   " S S	5      r " S
 S\\5      r " S S\\5      rg)z$
Test the memcache client protocol.
é    )ÚDeferredÚDeferredListÚTimeoutErrorÚgatherResults)ÚConnectionDone)ÚClock)Ú StringTransportWithDisconnection)ÚClientErrorÚMemCacheProtocolÚNoSuchCommandÚServerError)ÚTestCasec                   ó�   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rSrg)ÚCommandMixiné   zG
Setup and tests for basic invocation of L{MemCacheProtocol} commands.
c                 ó   • [        5       e)zX
Helper test method to test the resulting C{Deferred} of a
L{MemCacheProtocol} command.
)ÚNotImplementedError©ÚselfÚdÚsendÚrecvÚresults        Ú^C:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/test/test_memcache.pyÚ_testÚCommandMixin._test   s   € ô
 "Ó#Ð#ó    c                 ó\   • U R                  U R                  R                  S5      SSS5      $ )z©
L{MemCacheProtocol.get} returns a L{Deferred} which is called back with
the value and the flag associated with the given key if the server
returns a successful result.
ó   fooó	   get foo
ó   VALUE foo 0 3
bar
END
©r   ó   bar©r   ÚprotoÚget©r   s    r   Útest_getÚCommandMixin.test_get"   s.   € ð �z‰zØ�J‰J�N‰N˜6Ó"ØØ.Øó	
ð 	
r   c                 ó\   • U R                  U R                  R                  S5      SSS5      $ )z]
Test getting a non-available key: it succeeds but return L{None} as
value and C{0} as flag.
r   r    ó   END
©r   Nr$   r'   s    r   Útest_emptyGetÚCommandMixin.test_emptyGet/   s&   € ð
 �z‰z˜$Ÿ*™*Ÿ.™.¨Ó0°.À*ÈiÓXÐXr   c                 óf   • U R                  U R                  R                  SS/5      SSSSS.5      $ )z�
L{MemCacheProtocol.getMultiple} returns a L{Deferred} which is called
back with a dictionary of flag, value for each given key.
r   ó   cowó   get foo cow
s1   VALUE foo 0 3
bar
VALUE cow 0 7
chicken
END
)r   s   chickenr"   ©r0   r   ©r   r%   ÚgetMultipler'   s    r   Útest_getMultipleÚCommandMixin.test_getMultiple6   s:   € ð
 �z‰zØ�J‰J×"Ñ" F¨FÐ#3Ó4ØØJØ$¨kÑ:ó	
ð 	
r   c                 óf   • U R                  U R                  R                  SS/5      SSSSS.5      $ )zq
When L{MemCacheProtocol.getMultiple} is called with non-available keys,
the corresponding tuples are (0, None).
r   r0   r1   s   VALUE cow 1 3
bar
END
)é   r#   r,   r2   r3   r'   s    r   Útest_getMultipleWithEmptyÚ&CommandMixin.test_getMultipleWithEmptyB   s:   € ð
 �z‰zØ�J‰J×"Ñ" F¨FÐ#3Ó4ØØ.Ø ¨)Ñ4ó	
ð 	
r   c                 ó^   • U R                  U R                  R                  SS5      SSS5      $ )zn
L{MemCacheProtocol.set} returns a L{Deferred} which is called back with
C{True} when the operation succeeds.
r   r#   s   set foo 0 0 3
bar
ó   STORED
T)r   r%   Úsetr'   s    r   Útest_setÚCommandMixin.test_setN   ó0   € ð
 �z‰zØ�J‰J�N‰N˜6 6Ó*Ø'ØØó	
ð 	
r   c                 ó^   • U R                  U R                  R                  SS5      SSS5      $ )zn
L{MemCacheProtocol.add} returns a L{Deferred} which is called back with
C{True} when the operation succeeds.
r   r#   ó   add foo 0 0 3
bar
r<   T©r   r%   Úaddr'   s    r   Útest_addÚCommandMixin.test_addZ   r@   r   c                 ó^   • U R                  U R                  R                  SS5      SSS5      $ )zr
L{MemCacheProtocol.replace} returns a L{Deferred} which is called back
with C{True} when the operation succeeds.
r   r#   ó   replace foo 0 0 3
bar
r<   T©r   r%   Úreplacer'   s    r   Útest_replaceÚCommandMixin.test_replacef   s2   € ð
 �z‰zØ�J‰J×Ñ˜v vÓ.Ø+ØØó	
ð 	
r   c                 ó^   • U R                  U R                  R                  SS5      SSS5      $ )zÆ
Test an erroneous add: if a L{MemCacheProtocol.add} is called but the
key already exists on the server, it returns a B{NOT STORED} answer,
which calls back the resulting L{Deferred} with C{False}.
r   r#   rB   ó   NOT STORED
FrC   r'   s    r   Útest_errorAddÚCommandMixin.test_errorAddr   s0   € ð �z‰zØ�J‰J�N‰N˜6 6Ó*Ø'ØØó	
ð 	
r   c                 ó^   • U R                  U R                  R                  SS5      SSS5      $ )zÍ
Test an erroneous replace: if a L{MemCacheProtocol.replace} is called
but the key doesn't exist on the server, it returns a B{NOT STORED}
answer, which calls back the resulting L{Deferred} with C{False}.
r   r#   rH   rN   FrI   r'   s    r   Útest_errorReplaceÚCommandMixin.test_errorReplace   s2   € ð �z‰zØ�J‰J×Ñ˜v vÓ.Ø+ØØó	
ð 	
r   c                 ó\   • U R                  U R                  R                  S5      SSS5      $ )zx
L{MemCacheProtocol.delete} returns a L{Deferred} which is called back
with C{True} when the server notifies a success.
r#   ó   delete bar
s	   DELETED
T©r   r%   Údeleter'   s    r   Útest_deleteÚCommandMixin.test_deleteŒ   s.   € ð
 �z‰zØ�J‰J×Ñ˜fÓ%Ð'8¸.È$ó
ð 	
r   c                 ó\   • U R                  U R                  R                  S5      SSS5      $ )zŸ
Test an error during a delete: if key doesn't exist on the server, it
returns a B{NOT FOUND} answer which calls back the resulting
L{Deferred} with C{False}.
r#   rU   s   NOT FOUND
FrV   r'   s    r   Útest_errorDeleteÚCommandMixin.test_errorDelete•   s/   € ð �z‰zØ�J‰J×Ñ˜fÓ%Ð'8Ð:JÈEó
ð 	
r   c                 ó\   • U R                  U R                  R                  S5      SSS5      $ )z•
Test incrementing a variable: L{MemCacheProtocol.increment} returns a
L{Deferred} which is called back with the incremented value of the
given key.
r   s   incr foo 1
ó   4
é   ©r   r%   Ú	incrementr'   s    r   Útest_incrementÚCommandMixin.test_incrementŸ   ó*   € ð �z‰z˜$Ÿ*™*×.Ñ.¨vÓ6Ð8IÈ8ÐUVÓWÐWr   c                 ó\   • U R                  U R                  R                  S5      SSS5      $ )z•
Test decrementing a variable: L{MemCacheProtocol.decrement} returns a
L{Deferred} which is called back with the decremented value of the
given key.
r   s   decr foo 1
ó   5
é   ©r   r%   Ú	decrementr'   s    r   Útest_decrementÚCommandMixin.test_decrement§   rd   r   c                 ó^   • U R                  U R                  R                  SS5      SSS5      $ )zy
L{MemCacheProtocol.increment} takes an optional argument C{value} which
replaces the default value of 1 when specified.
r   é   s   incr foo 8
r^   r_   r`   r'   s    r   Útest_incrementValÚCommandMixin.test_incrementVal¯   ó0   € ð
 �z‰zØ�J‰J× Ñ  ¨Ó+Ð->ÀÈ!ó
ð 	
r   c                 ó^   • U R                  U R                  R                  SS5      SSS5      $ )zy
L{MemCacheProtocol.decrement} takes an optional argument C{value} which
replaces the default value of 1 when specified.
r   é   s   decr foo 3
rf   rg   rh   r'   s    r   Útest_decrementValÚCommandMixin.test_decrementVal¸   rp   r   c                 ó`   • U R                  U R                  R                  5       SSSSS.5      $ )zË
Test retrieving server statistics via the L{MemCacheProtocol.stats}
command: it parses the data sent by the server and calls back the
resulting L{Deferred} with a dictionary of the received statistics.
s   stats
ó"   STAT foo bar
STAT egg spam
END
r#   ó   spam©r   ó   egg©r   r%   Ústatsr'   s    r   Ú
test_statsÚCommandMixin.test_statsÁ   s3   € ð �z‰zØ�J‰J×ÑÓØØ7Ø WÑ-ó	
ð 	
r   c                 ób   • U R                  U R                  R                  S5      SSSSS.5      $ )a  
L{MemCacheProtocol.stats} takes an optional C{bytes} argument which,
if specified, is sent along with the I{STAT} command.  The I{STAT}
responses from the server are parsed as key/value pairs and returned
as a C{dict} (as in the case where the argument is not specified).
s   blahs   stats blah
rv   r#   rw   rx   rz   r'   s    r   Útest_statsWithArgumentÚ#CommandMixin.test_statsWithArgumentÎ   s5   € ð �z‰zØ�J‰J×Ñ˜WÓ%ØØ7Ø WÑ-ó	
ð 	
r   c                 óZ   • U R                  U R                  R                  5       SSS5      $ )z˜
Test version retrieval via the L{MemCacheProtocol.version} command: it
returns a L{Deferred} which is called back with the version sent by the
server.
s	   version
s   VERSION 1.1
s   1.1)r   r%   Úversionr'   s    r   Útest_versionÚCommandMixin.test_versionÜ   s,   € ð �z‰zØ�J‰J×ÑÓ  .Ð2DÀfó
ð 	
r   c                 óZ   • U R                  U R                  R                  5       SSS5      $ )zz
L{MemCacheProtocol.flushAll} returns a L{Deferred} which is called back
with C{True} if the server acknowledges success.
s   flush_all
s   OK
T)r   r%   ÚflushAllr'   s    r   Útest_flushAllÚCommandMixin.test_flushAllæ   s'   € ð
 �z‰z˜$Ÿ*™*×-Ñ-Ó/Ð1AÀ9ÈdÓSÐSr   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r(   r-   r5   r9   r>   rE   rK   rO   rR   rX   r[   rb   rj   rn   rs   r|   r   rƒ   r‡   Ú__static_attributes__r‰   r   r   r   r      so   † ñò$ò
òYò

ò

ò

ò

ò

ò
ò
ò
ò
òXòXò
ò
ò
ò
ò
õTr   r   c                   óÌ   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S!r#g")#ÚMemCacheTestséî   z1
Test client protocol class L{MemCacheProtocol}.
c                 ó(  • [        5       U l        [        5       U l        U R                  R                  U R                  l        [        5       U l        U R                  U R                  l        U R                  R                  U R                  5        g)zc
Create a memcache client, connect it to a string protocol, and make it
use a deterministic clock.
N)	r   r%   r   ÚclockÚ	callLaterr	   Ú	transportÚprotocolÚmakeConnectionr'   s    r   ÚsetUpÚMemCacheTests.setUpó   s]   € ô
 &Ó'ˆŒ
Ü“WˆŒ
Ø#Ÿz™z×3Ñ3ˆ�
‰
ÔÜ9Ó;ˆŒØ"&§*¡*ˆ�‰ÔØ�
‰
×!Ñ! $§.¡.Õ1r   c                 óÄ   ^ ^• UU 4S jnT R                  T R                  R                  5       U5        UR                  U5        T R                  R                  U5        U$ )a�  
Implementation of C{_test} which checks that the command sends C{send}
data, and that upon reception of C{recv} the result is C{result}.

@param d: the resulting deferred from the memcache command.
@type d: C{Deferred}

@param send: the expected data to be sent.
@type send: C{bytes}

@param recv: the data to simulate as reception.
@type recv: C{bytes}

@param result: the expected result.
@type result: C{any}
c                 ó*   >• TR                  U T5        g ©N)ÚassertEqual)Úresr   r   s    €€r   ÚcbÚMemCacheTests._test.<locals>.cb  s   ø€ Ø×Ñ˜S &Õ)r   )rž   r–   ÚvalueÚaddCallbackr%   ÚdataReceived)r   r   r   r   r   r    s   `   ` r   r   ÚMemCacheTests._testÿ   sJ   ù€ ö$	*ð 	×Ñ˜Ÿ™×-Ñ-Ó/°Ô6Ø	�‰�bÔØ�
‰
×Ñ Ô%Øˆr   c                 ó�   • U R                   R                  S5        U R                  [        U R                   R                  S5        g)z�
If the value returned doesn't match the expected key of the current
C{get} command, an error is raised in L{MemCacheProtocol.dataReceived}.
r   s   VALUE bar 0 7
spamegg
END
N)r%   r&   ÚassertRaisesÚRuntimeErrorr¤   r'   s    r   Útest_invalidGetResponseÚ%MemCacheTests.test_invalidGetResponse  s5   € ð
 	�
‰
�‰�vÔØ×ÑÜØ�J‰J×#Ñ#Ø2õ	
r   c                 ó”   • U R                   R                  SS/5        U R                  [        U R                   R                  S5        g)z¡
If the value returned doesn't match one the expected keys of the
current multiple C{get} command, an error is raised error in
L{MemCacheProtocol.dataReceived}.
r   r#   s   VALUE egg 0 7
spamegg
END
N)r%   r4   r§   r¨   r¤   r'   s    r   Útest_invalidMultipleGetResponseÚ-MemCacheTests.test_invalidMultipleGetResponse%  s<   € ð 	�
‰
×Ñ ¨Ð/Ô0Ø×ÑÜØ�J‰J×#Ñ#Ø2õ	
r   c                 ó’   • U R                   R                  SS5        U R                  [        U R                   R                  S5        g)z”
If an END is received in response to an operation that isn't C{get},
C{gets}, or C{stats}, an error is raised in
L{MemCacheProtocol.dataReceived}.
s   keys   valuer+   N)r%   r=   r§   r¨   r¤   r'   s    r   Útest_invalidEndResponseÚ%MemCacheTests.test_invalidEndResponse2  s2   € ð 	�
‰
�‰�v˜xÔ(Ø×Ñœ,¨¯
©
×(?Ñ(?ÀÕLr   c                 óä  ^ • T R                   R                  S5      nT R                   R                  S5      n[        5       nUR                  T R                   l        T R
                  R                  T R                   R                  5        T R                  U[        5        T R                  U[        5        U 4S jnUR                  U5        T R                  U[        5        [        XU/5      $ )z’
Test the timeout on outgoing requests: when timeout is detected, all
current commands fail with a L{TimeoutError}, and the connection is
closed.
r   r#   c                 ó<   >• TR                  [        U 5      S5        g )NzConnection timeout)rž   Ústr)Úerrorr   s    €r   ÚcheckMessageÚ0MemCacheTests.test_timeOut.<locals>.checkMessageJ  s   ø€ Ø×ÑœS ›ZÐ)=Õ>r   )r%   r&   r   ÚcallbackÚconnectionLostr”   ÚadvanceÚpersistentTimeOutÚassertFailurer   r£   r   r   )r   Úd1Úd2Úd3rµ   s   `    r   Útest_timeOutÚMemCacheTests.test_timeOut;  s®   ø€ ð �Z‰Z�^‰^˜FÓ#ˆØ�Z‰Z�^‰^˜FÓ#ˆÜ‹ZˆØ$&§K¡Kˆ�
‰
Ô!à�
‰
×Ñ˜4Ÿ:™:×7Ñ7Ô8Ø×Ñ˜2œ|Ô,Ø×Ñ˜2œ|Ô,õ	?ð 	�‰�|Ô$Ø×Ñ˜2œ~Ô.Ü˜b b˜\Ó*Ð*r   c                 ó  ^ • T R                   R                  S5      nT R                  R                  T R                   R                  S-
  5        T R                   R                  S5        U 4S jnUR                  U5        U$ )zI
When a request gets a response, no pending timeout call remains around.
r   r8   r!   c                 óˆ   >• TR                  U S5        TR                  [        TR                  R                  5      S5        g )Nr"   r   )rž   Úlenr”   Úcalls)r   r   s    €r   ÚcheckÚ0MemCacheTests.test_timeoutRemoved.<locals>.checkZ  s2   ø€ Ø×Ñ˜V [Ô1Ø×ÑœS §¡×!1Ñ!1Ó2°AÕ6r   )r%   r&   r”   r¹   rº   r¤   r£   )r   r   rÅ   s   `  r   Útest_timeoutRemovedÚ!MemCacheTests.test_timeoutRemovedQ  sc   ø€ ð �J‰J�N‰N˜6Ó"ˆà�
‰
×Ñ˜4Ÿ:™:×7Ñ7¸!Ñ;Ô<Ø�
‰
×ÑÐ BÔCõ	7ð 	
�‰�eÔØˆr   c                 ó†  • U R                   R                  S5      n[        5       nUR                  U R                   l        U R                   R                  S5        U R                  R                  U R                   R                  5        U R                  U[        5        U R                  U[        5        [        X/5      $ )z¨
Test the timeout when raw mode was started: the timeout is not reset
until all the data has been received, so we can have a L{TimeoutError}
when waiting for raw data.
r   s   VALUE foo 0 10
12345)r%   r&   r   r·   r¸   r¤   r”   r¹   rº   r»   r   r   r   ©r   r¼   r½   s      r   Útest_timeOutRawÚMemCacheTests.test_timeOutRawa  s‰   € ð �Z‰Z�^‰^˜FÓ#ˆÜ‹ZˆØ$&§K¡Kˆ�
‰
Ô!à�
‰
×ÑÐ :Ô;Ø�
‰
×Ñ˜4Ÿ:™:×7Ñ7Ô8Ø×Ñ˜2œ|Ô,Ø×Ñ˜2œ~Ô.Ü˜b˜XÓ&Ð&r   c                 ó„  • U R                   R                  5       n[        5       nUR                  U R                   l        U R                   R                  S5        U R                  R                  U R                   R                  5        U R                  U[        5        U R                  U[        5        [        X/5      $ )zn
Test the timeout when stat command has started: the timeout is not
reset until the final B{END} is received.
s   STAT foo bar
)r%   r{   r   r·   r¸   r¤   r”   r¹   rº   r»   r   r   r   rÊ   s      r   Útest_timeOutStatÚMemCacheTests.test_timeOutStatq  s‰   € ð
 �Z‰Z×ÑÓˆÜ‹ZˆØ$&§K¡Kˆ�
‰
Ô!à�
‰
×ÑÐ 3Ô4Ø�
‰
×Ñ˜4Ÿ:™:×7Ñ7Ô8Ø×Ñ˜2œ|Ô,Ø×Ñ˜2œ~Ô.Ü˜b˜XÓ&Ð&r   c                 óÆ  ^ ^^• T R                   R                  S5      nT R                   R                  S5      m[        5       nUR                  T R                   l        T R
                  R                  T R                   R                  S-
  5        T R                   R                  S5        UUU 4S jnU 4S jmUR                  U5        T R                  U[        5        U$ )zt
When two requests are sent, a timeout call remains around for the
second request, and its timeout time is correct.
r   r#   r8   r!   c                 óR  >• TR                  U S5        TR                  [        TR                  R                  5      S5        [	        TR
                  R                  5       H  nTR                  R                  S5        M      TR                  T[        5      R                  T5      $ )Nr"   r8   )rž   rÃ   r”   rÄ   Úranger%   rº   r¹   r»   r   r£   )r   ÚiÚ	checkTimer½   r   s     €€€r   rÅ   Ú3MemCacheTests.test_timeoutPipelining.<locals>.check�  s{   ø€ Ø×Ñ˜V [Ô1Ø×ÑœS §¡×!1Ñ!1Ó2°AÔ6Ü˜4Ÿ:™:×7Ñ7Ö8�Ø—
‘
×"Ñ" 1Ö%ñ 9à×%Ñ% b¬,Ó7×CÑCÀIÓNÐNr   c                 óŽ   >• TR                  TR                  R                  5       STR                  R                  -  S-
  5        g )Né   r8   )rž   r”   Úsecondsr%   rº   )Úignoredr   s    €r   rÔ   Ú7MemCacheTests.test_timeoutPipelining.<locals>.checkTime”  s7   ø€ ð ×Ñ˜TŸZ™Z×/Ñ/Ó1°1°t·z±z×7SÑ7SÑ3SÐVWÑ3WÕXr   )r%   r&   r   r·   r¸   r”   r¹   rº   r¤   r£   r»   r   )r   r¼   r¾   rÅ   rÔ   r½   s   `   @@r   Útest_timeoutPipeliningÚ$MemCacheTests.test_timeoutPipelining€  s£   ú€ ð
 �Z‰Z�^‰^˜FÓ#ˆØ�Z‰Z�^‰^˜FÓ#ˆÜ‹ZˆØ$&§K¡Kˆ�
‰
Ô!à�
‰
×Ñ˜4Ÿ:™:×7Ñ7¸!Ñ;Ô<Ø�
‰
×ÑÐ BÔC÷	Oõ	Yð
 	�‰�uÔØ×Ñ˜2œ~Ô.Øˆ	r   c                 óð  • U R                   R                  S5      n[        5       nUR                  U R                   l        U R
                  R                  U R                   R                  S-
  5        U R                   R                  S5      nU R
                  R                  S5        U R                  U[        5        U R                  U[        5        U R                  U[        5        [        XU/5      $ )zu
Check that timeout is not resetted for every command, but keep the
timeout from the first command without response.
r   r8   r#   )r%   r&   r   r·   r¸   r”   r¹   rº   r»   r   r   r   )r   r¼   r¾   r½   s       r   Útest_timeoutNotResetÚ"MemCacheTests.test_timeoutNotReset�  s±   € ð
 �Z‰Z�^‰^˜FÓ#ˆÜ‹ZˆØ$&§K¡Kˆ�
‰
Ô!à�
‰
×Ñ˜4Ÿ:™:×7Ñ7¸!Ñ;Ô<Ø�Z‰Z�^‰^˜FÓ#ˆØ�
‰
×Ñ˜1ÔØ×Ñ˜2œ|Ô,Ø×Ñ˜2œ|Ô,Ø×Ñ˜2œ~Ô.Ü˜b b˜\Ó*Ð*r   c                 ó<  • U R                   R                  S5      nU R                  R                  U R                   R                  5        U R                  U[        5        U R                   R                  S5      nU R                  U[        5        [        X/5      $ )zÝ
C{timeoutConnection} cleans the list of commands that it fires with
C{TimeoutError}: C{connectionLost} doesn't try to fire them again, but
sets the disconnected state so that future commands fail with a
C{RuntimeError}.
r   r#   )	r%   r&   r”   r¹   rº   r»   r   r¨   r   rÊ   s      r   Útest_timeoutCleanDeferredsÚ(MemCacheTests.test_timeoutCleanDeferreds®  sq   € ð �Z‰Z�^‰^˜FÓ#ˆØ�
‰
×Ñ˜4Ÿ:™:×7Ñ7Ô8Ø×Ñ˜2œ|Ô,Ø�Z‰Z�^‰^˜FÓ#ˆØ×Ñ˜2œ|Ô,Ü˜b˜XÓ&Ð&r   c                 óè   ^ • T R                   R                  S5      nT R                   R                  S5      nT R                  R                  5         [	        X/SS9nU 4S jnUR                  U5      $ )zT
When disconnection occurs while commands are still outstanding, the
commands fail.
r   r#   T)ÚconsumeErrorsc                 óh   >• U  H+  u  pTR                  U5        UR                  [        5        M-     g r�   )ÚassertFalseÚtrapr   )ÚresultsÚsuccessr   r   s      €r   ÚcheckFailuresÚ8MemCacheTests.test_connectionLost.<locals>.checkFailuresÆ  s)   ø€ Û#*‘�Ø× Ñ  Ô)Ø—‘œNÖ+ò $+r   )r%   r&   r–   ÚloseConnectionr   r£   )r   r¼   r½   Údonerê   s   `    r   Útest_connectionLostÚ!MemCacheTests.test_connectionLost¼  s_   ø€ ð
 �Z‰Z�^‰^˜FÓ#ˆØ�Z‰Z�^‰^˜FÓ#ˆØ�‰×%Ñ%Ô'Ü˜R˜H°DÑ9ˆõ	,ð
 ×Ñ Ó.Ð.r   c                 ó\  • U R                  U R                  R                  SS5      [        5      nU R                  U R                  R	                  S5      [        5      nU R                  U R                  R                  S5      [        5      nU R                  U R                  R                  SS5      [        5      nU R                  U R                  R                  SS5      [        5      nU R                  U R                  R                  SS/5      [        5      n[        XX4XV/5      $ )zƒ
An error is raised when trying to use a too long key: the called
command returns a L{Deferred} which fails with a L{ClientError}.
sô  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar#   r   )
r»   r%   r=   r
   ra   r&   ÚappendÚprependr4   r   )r   r¼   r½   r¾   Úd4Úd5Úd6s          r   Útest_tooLongKeyÚMemCacheTests.test_tooLongKeyÍ  sè   € ð
 ×Ñ §
¡
§¡¨z¸6Ó BÄKÓPˆØ×Ñ §
¡
× 4Ñ 4°ZÓ @Ä+ÓNˆØ×Ñ §
¡
§¡¨zÓ :¼KÓHˆØ×Ñ §
¡
× 1Ñ 1°*¸fÓ EÄ{ÓSˆØ×Ñ §
¡
× 2Ñ 2°:¸vÓ FÌÓTˆØ×ÑØ�J‰J×"Ñ" F¨JÐ#7Ó8¼+ó
ˆô ˜b b¨bÐ5Ó6Ð6r   c                 óü   • U R                   R                  SSSSSS5      nU R                  U R                  R	                  5       S5        U R                  U[        5        U R                   R                  S5        U$ )zœ
When an unknown command is sent directly (not through public API), the
server answers with an B{ERROR} token, and the command fails with
L{NoSuchCommand}.
ry   r   r#   r   r   s   egg foo 0 0 3
bar
s   ERROR
)r%   Ú_setrž   r–   r¢   r»   r   r¤   ©r   r   s     r   Útest_invalidCommandÚ!MemCacheTests.test_invalidCommandÜ  se   € ð �J‰J�O‰O˜F F¨F°A°q¸#Ó>ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1LÔMØ×Ñ˜1œmÔ,Ø�
‰
×Ñ Ô-Øˆr   c                 ó(  ^ • SnT R                   R                  SU5      nT R                  T R                  R	                  5       S5        T R                  U[        5        U 4S jnUR                  U5        T R                   R                  S5        U$ )z¶
Test the L{ClientError} error: when the server sends a B{CLIENT_ERROR}
token, the originating command fails with L{ClientError}, and the error
contains the text sent by the server.
ó   eggspammr   ó   set foo 0 0 8
eggspamm
c                 óN   >• TR                  [        U 5      [        S5      5        g )Ns   We don't like egg and spam©rž   r³   Úrepr©Úerrr   s    €r   rÅ   Ú-MemCacheTests.test_clientError.<locals>.checkó  s   ø€ Ø×ÑœS ›X¤tÐ,IÓ'JÕKr   s)   CLIENT_ERROR We don't like egg and spam
)	r%   r=   rž   r–   r¢   r»   r
   r£   r¤   ©r   Úar   rÅ   s   `   r   Útest_clientErrorÚMemCacheTests.test_clientErrorè  sx   ø€ ð ˆØ�J‰J�N‰N˜6 1Ó%ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1QÔRØ×Ñ˜1œkÔ*õ	Lð 	
�‰�eÔØ�
‰
×ÑÐ NÔOØˆr   c                 ó(  ^ • SnT R                   R                  SU5      nT R                  T R                  R	                  5       S5        T R                  U[        5        U 4S jnUR                  U5        T R                   R                  S5        U$ )z¶
Test the L{ServerError} error: when the server sends a B{SERVER_ERROR}
token, the originating command fails with L{ServerError}, and the error
contains the text sent by the server.
rþ   r   rÿ   c                 óN   >• TR                  [        U 5      [        S5      5        g )Ns   zomgr  r  s    €r   rÅ   Ú-MemCacheTests.test_serverError.<locals>.check  s   ø€ Ø×ÑœS ›X¤t¨G£}Õ5r   s   SERVER_ERROR zomg
)	r%   r=   rž   r–   r¢   r»   r   r£   r¤   r  s   `   r   Útest_serverErrorÚMemCacheTests.test_serverErrorú  sw   ø€ ð ˆØ�J‰J�N‰N˜6 1Ó%ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1QÔRØ×Ñ˜1œkÔ*õ	6ð 	
�‰�eÔØ�
‰
×ÑÐ 8Ô9Øˆr   c           	      ó¼  • U R                  U R                  R                  SS5      [        5      nU R                  U R                  R	                  S5      [        5      nU R                  U R                  R                  S5      [        5      nU R                  U R                  R                  S5      [        5      nU R                  U R                  R                  SS5      [        5      nU R                  U R                  R                  SS5      [        5      nU R                  U R                  R                  SS/5      [        5      n[        XX4XVU/5      $ )zA
Using a non-string key as argument to commands raises an error.
Úfoor#   Úeggr8   Úbarry   )r»   r%   r=   r
   ra   r&   rW   rñ   rò   r4   r   )r   r¼   r½   r¾   ró   rô   rõ   Úd7s           r   Útest_unicodeKeyÚMemCacheTests.test_unicodeKey  s  € ð ×Ñ §
¡
§¡¨u°fÓ =¼{ÓKˆØ×Ñ §
¡
× 4Ñ 4°UÓ ;¼[ÓIˆØ×Ñ §
¡
§¡¨qÓ 1´;Ó?ˆØ×Ñ §
¡
× 1Ñ 1°%Ó 8¼+ÓFˆØ×Ñ §
¡
× 1Ñ 1°%¸Ó @Ä+ÓNˆØ×Ñ §
¡
× 2Ñ 2°5¸&Ó AÄ;ÓOˆØ×Ñ §
¡
× 6Ñ 6¸À°{Ó CÄ[ÓQˆÜ˜b b¨b°bÐ9Ó:Ð:r   c                 ób   • U R                  U R                  R                  SS5      [        5      $ )z+
Using a non-string value raises an error.
r   r  )r»   r%   r=   r
   r'   s    r   Útest_unicodeValueÚMemCacheTests.test_unicodeValue  s&   € ð ×!Ñ! $§*¡*§.¡.°¸Ó"?ÄÓMÐMr   c                 óò  • U R                   R                  S5      nUR                  U R                  S5        U R                   R	                  SS5      nUR                  U R                  S5        U R                   R                  S5      nUR                  U R                  S5        U R                  U R
                  R                  5       S5        U R                   R                  S	5        [        XU/5      $ )
z�
Multiple requests can be sent subsequently to the server, and the
protocol orders the responses correctly and dispatch to the
corresponding client command.
r   r"   r#   s   spamspamspamTry   )r   rw   s0   get foo
set bar 0 0 12
spamspamspam
get egg
s;   VALUE foo 0 3
bar
END
STORED
VALUE egg 0 4
spam
END
)	r%   r&   r£   rž   r=   r–   r¢   r¤   r   )r   r¼   r½   r¾   s       r   Útest_pipeliningÚMemCacheTests.test_pipelining  sÃ   € ð �Z‰Z�^‰^˜FÓ#ˆØ
�‰�t×'Ñ'¨Ô5Ø�Z‰Z�^‰^˜F OÓ4ˆØ
�‰�t×'Ñ'¨Ô.Ø�Z‰Z�^‰^˜FÓ#ˆØ
�‰�t×'Ñ'¨Ô6Ø×ÑØ�N‰N× Ñ Ó"ØGô	
ð 	�
‰
×Ñð0ô	
ô
 ˜b b˜\Ó*Ð*r   c                 ó   • U R                   R                  S5      nUR                  U R                  S5        U R                  U R                  R                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                   R                  S5        U R                   R                  S5        U$ )z|
If the value retrieved by a C{get} arrive in chunks, the protocol
is able to reconstruct it and to produce the good value.
r   )r   s
   0123456789r    s   VALUE foo 0 10
0123456s   789s   
ENDs   
)r%   r&   r£   rž   r–   r¢   r¤   rú   s     r   Útest_getInChunksÚMemCacheTests.test_getInChunks6  s–   € ð
 �J‰J�N‰N˜6Ó"ˆØ	�‰�d×&Ñ&Ð(:Ô;Ø×Ñ˜Ÿ™×-Ñ-Ó/°Ô@Ø�
‰
×ÑÐ <Ô=Ø�
‰
×Ñ Ô'Ø�
‰
×Ñ 
Ô+Ø�
‰
×Ñ Ô(Øˆr   c                 ó^   • U R                  U R                  R                  SS5      SSS5      $ )z£
L{MemCacheProtocol.append} behaves like a L{MemCacheProtocol.set}
method: it returns a L{Deferred} which is called back with C{True} when
the operation succeeds.
r   r#   s   append foo 0 0 3
bar
r<   T)r   r%   rñ   r'   s    r   Útest_appendÚMemCacheTests.test_appendD  s2   € ð �z‰zØ�J‰J×Ñ˜f fÓ-Ø*ØØó	
ð 	
r   c                 ó^   • U R                  U R                  R                  SS5      SSS5      $ )z¤
L{MemCacheProtocol.prepend} behaves like a L{MemCacheProtocol.set}
method: it returns a L{Deferred} which is called back with C{True} when
the operation succeeds.
r   r#   s   prepend foo 0 0 3
bar
r<   T)r   r%   rò   r'   s    r   Útest_prependÚMemCacheTests.test_prependQ  s2   € ð �z‰zØ�J‰J×Ñ˜v vÓ.Ø+ØØó	
ð 	
r   c                 ó^   • U R                  U R                  R                  SS5      SSS5      $ )z‰
L{MemCacheProtocol.get} handles an additional cas result when
C{withIdentifier} is C{True} and forward it in the resulting
L{Deferred}.
r   Tó
   gets foo
s   VALUE foo 0 3 1234
bar
END
)r   ó   1234r#   r$   r'   s    r   Ú	test_getsÚMemCacheTests.test_gets^  s0   € ð �z‰zØ�J‰J�N‰N˜6 4Ó(ØØ3Ø ó	
ð 	
r   c                 ó^   • U R                  U R                  R                  SS5      SSS5      $ )z{
Test getting a non-available key with gets: it succeeds but return
L{None} as value, C{0} as flag and an empty cas value.
r   Tr&  r+   ©r   r   Nr$   r'   s    r   Útest_emptyGetsÚMemCacheTests.test_emptyGetsk  s-   € ð
 �z‰zØ�J‰J�N‰N˜6 4Ó(¨/¸:À~ó
ð 	
r   c                 óh   • U R                  U R                  R                  SS/S5      SSSSS.5      $ )	zy
L{MemCacheProtocol.getMultiple} handles an additional cas field in the
returned tuples if C{withIdentifier} is C{True}.
r   r#   Tó   gets foo bar
ó8   VALUE foo 0 3 1234
egg
VALUE bar 0 4 2345
spam
END
©r   s   2345rw   ©r   r'  ry   ©r#   r   r3   r'   s    r   Útest_getsMultipleÚMemCacheTests.test_getsMultiplet  s=   € ð
 �z‰zØ�J‰J×"Ñ" F¨FÐ#3°TÓ:ØØUØ*Ð4HÑIó	
ð 	
r   c                 óz   • U R                  U R                  R                  [        SS/5      S5      SSSSS.5      $ )	z?
L{MemCacheProtocol.getMultiple} accepts any iterable of keys.
r   r#   Tr/  r0  r1  r2  r3  )r   r%   r4   Úiterr'   s    r   Útest_getsMultipleIterableKeysÚ+MemCacheTests.test_getsMultipleIterableKeys€  sB   € ð �z‰zØ�J‰J×"Ñ"¤4¨°Ð(8Ó#9¸4Ó@ØØUØ*Ð4HÑIó	
ð 	
r   c                 óh   • U R                  U R                  R                  SS/S5      SSSSS.5      $ )	zô
When getting a non-available key with L{MemCacheProtocol.getMultiple}
when C{withIdentifier} is C{True}, the other keys are retrieved
correctly, and the non-available key gets a tuple of C{0} as flag,
L{None} as value, and an empty cas value.
r   r#   Tr/  s   VALUE foo 0 3 1234
egg
END
r+  r2  r3  r3   r'   s    r   Útest_getsMultipleWithEmptyÚ(MemCacheTests.test_getsMultipleWithEmpty‹  s=   € ð �z‰zØ�J‰J×"Ñ" F¨FÐ#3°TÓ:ØØ3Ø#Ð-AÑBó	
ð 	
r   c                 ó\   • U R                  U R                  R                  SSSS9SSS5      $ )z…
L{MemCacheProtocol.checkAndSet} passes an additional cas identifier
that the server handles to check if the data has to be updated.
r   r#   r'  ©Úcasó   cas foo 0 0 3 1234
bar
r<   T©r   r%   ÚcheckAndSetr'   s    r   Útest_checkAndSetÚMemCacheTests.test_checkAndSet™  s7   € ð
 �z‰zØ�J‰J×"Ñ" 6¨6°wÐ"Ð?Ø,ØØó	
ð 	
r   c                 ó\   • U R                  U R                  R                  SSSS9SSS5      $ )zl
When L{MemCacheProtocol.checkAndSet} response is C{EXISTS}, the
resulting L{Deferred} fires with C{False}.
r   r#   r'  r>  r@  s   EXISTS
FrA  r'   s    r   Útest_casUnknowKeyÚMemCacheTests.test_casUnknowKey¥  s7   € ð
 �z‰zØ�J‰J×"Ñ" 6¨6°wÐ"Ð?Ø,ØØó	
ð 	
r   ©r”   r%   r–   N)$rŠ   r‹   rŒ   r�   rŽ   r™   r   r©   r¬   r¯   r¿   rÇ   rË   rÎ   rÛ   rÞ   rá   rî   rö   rû   r  r  r  r  r  r  r   r#  r(  r,  r4  r8  r;  rC  rF  r�   r‰   r   r   r‘   r‘   î   sŸ   † ñò
2òò4

ò
òMò+ò,ò 'ò 'òò:+ò"'ò/ò"7ò
òò$ò$;òNò+ò.ò
ò
ò
ò
ò

ò	
ò
ò

õ

r   r‘   c                   ó$   • \ rS rSrSrS rS rSrg)ÚCommandFailureTestsi²  zN
Tests for correct failure of commands on a disconnected
L{MemCacheProtocol}.
c                 ó\  • [        5       U l        [        5       U l        U R                  R                  U R                  l        [        5       U l        U R                  U R                  l        U R                  R                  U R                  5        U R                  R                  5         g)zE
Create a disconnected memcache client, using a deterministic clock.
N)
r   r%   r   r”   r•   r	   r–   r—   r˜   rì   r'   s    r   r™   ÚCommandFailureTests.setUp¸  sm   € ô &Ó'ˆŒ
Ü“WˆŒ
Ø#Ÿz™z×3Ñ3ˆ�
‰
ÔÜ9Ó;ˆŒØ"&§*¡*ˆ�‰ÔØ�
‰
×!Ñ! $§.¡.Ô1Ø�‰×%Ñ%Õ'r   c                 ó.   • U R                  U[        5      $ )z¨
Implementation of C{_test} which checks that the command fails with
C{RuntimeError} because the transport is disconnected. All the
parameters except C{d} are ignored.
)r»   r¨   r   s        r   r   ÚCommandFailureTests._testÄ  s   € ð ×!Ñ! !¤\Ó2Ð2r   rH  N)rŠ   r‹   rŒ   r�   rŽ   r™   r   r�   r‰   r   r   rJ  rJ  ²  s   † ñò

(õ3r   rJ  N)rŽ   Útwisted.internet.deferr   r   r   r   Útwisted.internet.errorr   Útwisted.internet.taskr   Útwisted.internet.testingr	   Útwisted.protocols.memcacher
   r   r   r   Útwisted.trial.unittestr   r   r‘   rJ  r‰   r   r   Ú<module>rU     sY   ðñ÷
 WÓ VÝ 1Ý 'Ý E÷ó õ ,÷UTñ UTôpA
�L (ô A
ôH3˜,¨õ 3r   