| Index: third_party/twisted_8_1/twisted/test/test_memcache.py
|
| diff --git a/third_party/twisted_8_1/twisted/test/test_memcache.py b/third_party/twisted_8_1/twisted/test/test_memcache.py
|
| deleted file mode 100644
|
| index ea8fb4049a28ffe0cdefc0111296eef4046f1a5d..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/test/test_memcache.py
|
| +++ /dev/null
|
| @@ -1,510 +0,0 @@
|
| -# Copyright (c) 2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -Test the memcache client protocol.
|
| -"""
|
| -
|
| -from twisted.protocols.memcache import MemCacheProtocol, NoSuchCommand
|
| -from twisted.protocols.memcache import ClientError, ServerError
|
| -
|
| -from twisted.trial.unittest import TestCase
|
| -from twisted.test.proto_helpers import StringTransportWithDisconnection
|
| -from twisted.internet.task import Clock
|
| -from twisted.internet.defer import Deferred, gatherResults, TimeoutError
|
| -
|
| -
|
| -
|
| -class MemCacheTestCase(TestCase):
|
| - """
|
| - Test client protocol class L{MemCacheProtocol}.
|
| - """
|
| -
|
| - def setUp(self):
|
| - """
|
| - Create a memcache client, connect it to a string protocol, and make it
|
| - use a deterministic clock.
|
| - """
|
| - self.proto = MemCacheProtocol()
|
| - self.clock = Clock()
|
| - self.proto.callLater = self.clock.callLater
|
| - self.transport = StringTransportWithDisconnection()
|
| - self.transport.protocol = self.proto
|
| - self.proto.makeConnection(self.transport)
|
| -
|
| -
|
| - def _test(self, d, send, recv, result):
|
| - """
|
| - Shortcut method for classic tests.
|
| -
|
| - @param d: the resulting deferred from the memcache command.
|
| - @type d: C{Deferred}
|
| -
|
| - @param send: the expected data to be sent.
|
| - @type send: C{str}
|
| -
|
| - @param recv: the data to simulate as reception.
|
| - @type recv: C{str}
|
| -
|
| - @param result: the expected result.
|
| - @type result: C{any}
|
| - """
|
| - def cb(res):
|
| - self.assertEquals(res, result)
|
| - self.assertEquals(self.transport.value(), send)
|
| - d.addCallback(cb)
|
| - self.proto.dataReceived(recv)
|
| - return d
|
| -
|
| -
|
| - def test_get(self):
|
| - """
|
| - L{MemCacheProtocol.get} should return 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.
|
| - """
|
| - return self._test(self.proto.get("foo"), "get foo\r\n",
|
| - "VALUE foo 0 3\r\nbar\r\nEND\r\n", (0, "bar"))
|
| -
|
| -
|
| - def test_emptyGet(self):
|
| - """
|
| - Test getting a non-available key: it should succeed but return C{None}
|
| - as value and C{0} as flag.
|
| - """
|
| - return self._test(self.proto.get("foo"), "get foo\r\n",
|
| - "END\r\n", (0, None))
|
| -
|
| -
|
| - def test_set(self):
|
| - """
|
| - L{MemCacheProtocol.set} should return a L{Deferred} which is
|
| - called back with C{True} when the operation succeeds.
|
| - """
|
| - return self._test(self.proto.set("foo", "bar"),
|
| - "set foo 0 0 3\r\nbar\r\n", "STORED\r\n", True)
|
| -
|
| -
|
| - def test_add(self):
|
| - """
|
| - L{MemCacheProtocol.add} should return a L{Deferred} which is
|
| - called back with C{True} when the operation succeeds.
|
| - """
|
| - return self._test(self.proto.add("foo", "bar"),
|
| - "add foo 0 0 3\r\nbar\r\n", "STORED\r\n", True)
|
| -
|
| -
|
| - def test_replace(self):
|
| - """
|
| - L{MemCacheProtocol.replace} should return a L{Deferred} which
|
| - is called back with C{True} when the operation succeeds.
|
| - """
|
| - return self._test(self.proto.replace("foo", "bar"),
|
| - "replace foo 0 0 3\r\nbar\r\n", "STORED\r\n", True)
|
| -
|
| -
|
| - def test_errorAdd(self):
|
| - """
|
| - 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 should callback the resulting L{Deferred} with C{False}.
|
| - """
|
| - return self._test(self.proto.add("foo", "bar"),
|
| - "add foo 0 0 3\r\nbar\r\n", "NOT STORED\r\n", False)
|
| -
|
| -
|
| - def test_errorReplace(self):
|
| - """
|
| - 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 should callback the resulting L{Deferred} with C{False}.
|
| - """
|
| - return self._test(self.proto.replace("foo", "bar"),
|
| - "replace foo 0 0 3\r\nbar\r\n", "NOT STORED\r\n", False)
|
| -
|
| -
|
| - def test_delete(self):
|
| - """
|
| - L{MemCacheProtocol.delete} should return a L{Deferred} which is
|
| - called back with C{True} when the server notifies a success.
|
| - """
|
| - return self._test(self.proto.delete("bar"), "delete bar\r\n",
|
| - "DELETED\r\n", True)
|
| -
|
| -
|
| - def test_errorDelete(self):
|
| - """
|
| - Test a error during a delete: if key doesn't exist on the server, it
|
| - returns a B{NOT FOUND} answer which should callback the resulting
|
| - L{Deferred} with C{False}.
|
| - """
|
| - return self._test(self.proto.delete("bar"), "delete bar\r\n",
|
| - "NOT FOUND\r\n", False)
|
| -
|
| -
|
| - def test_increment(self):
|
| - """
|
| - Test incrementing a variable: L{MemCacheProtocol.increment} should
|
| - return a L{Deferred} which is called back with the incremented value of
|
| - the given key.
|
| - """
|
| - return self._test(self.proto.increment("foo"), "incr foo 1\r\n",
|
| - "4\r\n", 4)
|
| -
|
| -
|
| - def test_decrement(self):
|
| - """
|
| - Test decrementing a variable: L{MemCacheProtocol.decrement} should
|
| - return a L{Deferred} which is called back with the decremented value of
|
| - the given key.
|
| - """
|
| - return self._test(
|
| - self.proto.decrement("foo"), "decr foo 1\r\n", "5\r\n", 5)
|
| -
|
| -
|
| - def test_incrementVal(self):
|
| - """
|
| - L{MemCacheProtocol.increment} takes an optional argument C{value} which
|
| - should replace the default value of 1 when specified.
|
| - """
|
| - return self._test(self.proto.increment("foo", 8), "incr foo 8\r\n",
|
| - "4\r\n", 4)
|
| -
|
| -
|
| - def test_decrementVal(self):
|
| - """
|
| - L{MemCacheProtocol.decrement} takes an optional argument C{value} which
|
| - should replace the default value of 1 when specified.
|
| - """
|
| - return self._test(self.proto.decrement("foo", 3), "decr foo 3\r\n",
|
| - "5\r\n", 5)
|
| -
|
| -
|
| - def test_stats(self):
|
| - """
|
| - Test retrieving server statistics via the L{MemCacheProtocol.stats}
|
| - command: it should parse the data sent by the server and call back the
|
| - resulting L{Deferred} with a dictionary of the received statistics.
|
| - """
|
| - return self._test(self.proto.stats(), "stats\r\n",
|
| - "STAT foo bar\r\nSTAT egg spam\r\nEND\r\n",
|
| - {"foo": "bar", "egg": "spam"})
|
| -
|
| -
|
| - def test_version(self):
|
| - """
|
| - Test version retrieval via the L{MemCacheProtocol.version} command: it
|
| - should return a L{Deferred} which is called back with the version sent
|
| - by the server.
|
| - """
|
| - return self._test(self.proto.version(), "version\r\n",
|
| - "VERSION 1.1\r\n", "1.1")
|
| -
|
| -
|
| - def test_flushAll(self):
|
| - """
|
| - L{MemCacheProtocol.flushAll} should return a L{Deferred} which is
|
| - called back with C{True} if the server acknowledges success.
|
| - """
|
| - return self._test(self.proto.flushAll(), "flush_all\r\n",
|
| - "OK\r\n", True)
|
| -
|
| -
|
| - def test_invalidGetResponse(self):
|
| - """
|
| - If the value returned doesn't match the expected key of the current, we
|
| - should get an error in L{MemCacheProtocol.dataReceived}.
|
| - """
|
| - self.proto.get("foo")
|
| - s = "spamegg"
|
| - self.assertRaises(RuntimeError,
|
| - self.proto.dataReceived,
|
| - "VALUE bar 0 %s\r\n%s\r\nEND\r\n" % (len(s), s))
|
| -
|
| -
|
| - def test_timeOut(self):
|
| - """
|
| - Test the timeout on outgoing requests: when timeout is detected, all
|
| - current commands should fail with a L{TimeoutError}, and the
|
| - connection should be closed.
|
| - """
|
| - d1 = self.proto.get("foo")
|
| - d2 = self.proto.get("bar")
|
| - d3 = Deferred()
|
| - self.proto.connectionLost = d3.callback
|
| -
|
| - self.clock.advance(self.proto.persistentTimeOut)
|
| - self.assertFailure(d1, TimeoutError)
|
| - self.assertFailure(d2, TimeoutError)
|
| - def checkMessage(error):
|
| - self.assertEquals(str(error), "Connection timeout")
|
| - d1.addCallback(checkMessage)
|
| - return gatherResults([d1, d2, d3])
|
| -
|
| -
|
| - def test_timeoutRemoved(self):
|
| - """
|
| - When a request gets a response, no pending timeout call should remain
|
| - around.
|
| - """
|
| - d = self.proto.get("foo")
|
| -
|
| - self.clock.advance(self.proto.persistentTimeOut - 1)
|
| - self.proto.dataReceived("VALUE foo 0 3\r\nbar\r\nEND\r\n")
|
| -
|
| - def check(result):
|
| - self.assertEquals(result, (0, "bar"))
|
| - self.assertEquals(len(self.clock.calls), 0)
|
| - d.addCallback(check)
|
| - return d
|
| -
|
| -
|
| - def test_timeOutRaw(self):
|
| - """
|
| - Test the timeout when raw mode was started: the timeout should not be
|
| - reset until all the data has been received, so we can have a
|
| - L{TimeoutError} when waiting for raw data.
|
| - """
|
| - d1 = self.proto.get("foo")
|
| - d2 = Deferred()
|
| - self.proto.connectionLost = d2.callback
|
| -
|
| - self.proto.dataReceived("VALUE foo 0 10\r\n12345")
|
| - self.clock.advance(self.proto.persistentTimeOut)
|
| - self.assertFailure(d1, TimeoutError)
|
| - return gatherResults([d1, d2])
|
| -
|
| -
|
| - def test_timeOutStat(self):
|
| - """
|
| - Test the timeout when stat command has started: the timeout should not
|
| - be reset until the final B{END} is received.
|
| - """
|
| - d1 = self.proto.stats()
|
| - d2 = Deferred()
|
| - self.proto.connectionLost = d2.callback
|
| -
|
| - self.proto.dataReceived("STAT foo bar\r\n")
|
| - self.clock.advance(self.proto.persistentTimeOut)
|
| - self.assertFailure(d1, TimeoutError)
|
| - return gatherResults([d1, d2])
|
| -
|
| -
|
| - def test_timeoutPipelining(self):
|
| - """
|
| - When two requests are sent, a timeout call should remain around for the
|
| - second request, and its timeout time should be correct.
|
| - """
|
| - d1 = self.proto.get("foo")
|
| - d2 = self.proto.get("bar")
|
| - d3 = Deferred()
|
| - self.proto.connectionLost = d3.callback
|
| -
|
| - self.clock.advance(self.proto.persistentTimeOut - 1)
|
| - self.proto.dataReceived("VALUE foo 0 3\r\nbar\r\nEND\r\n")
|
| -
|
| - def check(result):
|
| - self.assertEquals(result, (0, "bar"))
|
| - self.assertEquals(len(self.clock.calls), 1)
|
| - for i in range(self.proto.persistentTimeOut):
|
| - self.clock.advance(1)
|
| - return self.assertFailure(d2, TimeoutError).addCallback(checkTime)
|
| - def checkTime(ignored):
|
| - # Check that the timeout happened C{self.proto.persistentTimeOut}
|
| - # after the last response
|
| - self.assertEquals(self.clock.seconds(),
|
| - 2 * self.proto.persistentTimeOut - 1)
|
| - d1.addCallback(check)
|
| - return d1
|
| -
|
| -
|
| - def test_timeoutNotReset(self):
|
| - """
|
| - Check that timeout is not resetted for every command, but keep the
|
| - timeout from the first command without response.
|
| - """
|
| - d1 = self.proto.get("foo")
|
| - d3 = Deferred()
|
| - self.proto.connectionLost = d3.callback
|
| -
|
| - self.clock.advance(self.proto.persistentTimeOut - 1)
|
| - d2 = self.proto.get("bar")
|
| - self.clock.advance(1)
|
| - self.assertFailure(d1, TimeoutError)
|
| - self.assertFailure(d2, TimeoutError)
|
| - return gatherResults([d1, d2, d3])
|
| -
|
| -
|
| - def test_tooLongKey(self):
|
| - """
|
| - Test that an error is raised when trying to use a too long key: the
|
| - called command should return a L{Deferred} which fail with a
|
| - L{ClientError}.
|
| - """
|
| - d1 = self.assertFailure(self.proto.set("a" * 500, "bar"), ClientError)
|
| - d2 = self.assertFailure(self.proto.increment("a" * 500), ClientError)
|
| - d3 = self.assertFailure(self.proto.get("a" * 500), ClientError)
|
| - d4 = self.assertFailure(self.proto.append("a" * 500, "bar"), ClientError)
|
| - d5 = self.assertFailure(self.proto.prepend("a" * 500, "bar"), ClientError)
|
| - return gatherResults([d1, d2, d3, d4, d5])
|
| -
|
| -
|
| - def test_invalidCommand(self):
|
| - """
|
| - When an unknown command is sent directly (not through public API), the
|
| - server answers with an B{ERROR} token, and the command should fail with
|
| - L{NoSuchCommand}.
|
| - """
|
| - d = self.proto._set("egg", "foo", "bar", 0, 0, "")
|
| - self.assertEquals(self.transport.value(), "egg foo 0 0 3\r\nbar\r\n")
|
| - self.assertFailure(d, NoSuchCommand)
|
| - self.proto.dataReceived("ERROR\r\n")
|
| - return d
|
| -
|
| -
|
| - def test_clientError(self):
|
| - """
|
| - Test the L{ClientError} error: when the server send a B{CLIENT_ERROR}
|
| - token, the originating command should fail with L{ClientError}, and the
|
| - error should contain the text sent by the server.
|
| - """
|
| - a = "eggspamm"
|
| - d = self.proto.set("foo", a)
|
| - self.assertEquals(self.transport.value(),
|
| - "set foo 0 0 8\r\neggspamm\r\n")
|
| - self.assertFailure(d, ClientError)
|
| - def check(err):
|
| - self.assertEquals(str(err), "We don't like egg and spam")
|
| - d.addCallback(check)
|
| - self.proto.dataReceived("CLIENT_ERROR We don't like egg and spam\r\n")
|
| - return d
|
| -
|
| -
|
| - def test_serverError(self):
|
| - """
|
| - Test the L{ServerError} error: when the server send a B{SERVER_ERROR}
|
| - token, the originating command should fail with L{ServerError}, and the
|
| - error should contain the text sent by the server.
|
| - """
|
| - a = "eggspamm"
|
| - d = self.proto.set("foo", a)
|
| - self.assertEquals(self.transport.value(),
|
| - "set foo 0 0 8\r\neggspamm\r\n")
|
| - self.assertFailure(d, ServerError)
|
| - def check(err):
|
| - self.assertEquals(str(err), "zomg")
|
| - d.addCallback(check)
|
| - self.proto.dataReceived("SERVER_ERROR zomg\r\n")
|
| - return d
|
| -
|
| -
|
| - def test_unicodeKey(self):
|
| - """
|
| - Using a non-string key as argument to commands should raise an error.
|
| - """
|
| - d1 = self.assertFailure(self.proto.set(u"foo", "bar"), ClientError)
|
| - d2 = self.assertFailure(self.proto.increment(u"egg"), ClientError)
|
| - d3 = self.assertFailure(self.proto.get(1), ClientError)
|
| - d4 = self.assertFailure(self.proto.delete(u"bar"), ClientError)
|
| - d5 = self.assertFailure(self.proto.append(u"foo", "bar"), ClientError)
|
| - d6 = self.assertFailure(self.proto.prepend(u"foo", "bar"), ClientError)
|
| - return gatherResults([d1, d2, d3, d4, d5, d6])
|
| -
|
| -
|
| - def test_unicodeValue(self):
|
| - """
|
| - Using a non-string value should raise an error.
|
| - """
|
| - return self.assertFailure(self.proto.set("foo", u"bar"), ClientError)
|
| -
|
| -
|
| - def test_pipelining(self):
|
| - """
|
| - Test that multiple requests can be sent subsequently to the server, and
|
| - that the protocol order the responses correctly and dispatch to the
|
| - corresponding client command.
|
| - """
|
| - d1 = self.proto.get("foo")
|
| - d1.addCallback(self.assertEquals, (0, "bar"))
|
| - d2 = self.proto.set("bar", "spamspamspam")
|
| - d2.addCallback(self.assertEquals, True)
|
| - d3 = self.proto.get("egg")
|
| - d3.addCallback(self.assertEquals, (0, "spam"))
|
| - self.assertEquals(self.transport.value(),
|
| - "get foo\r\nset bar 0 0 12\r\nspamspamspam\r\nget egg\r\n")
|
| - self.proto.dataReceived("VALUE foo 0 3\r\nbar\r\nEND\r\n"
|
| - "STORED\r\n"
|
| - "VALUE egg 0 4\r\nspam\r\nEND\r\n")
|
| - return gatherResults([d1, d2, d3])
|
| -
|
| -
|
| - def test_getInChunks(self):
|
| - """
|
| - If the value retrieved by a C{get} arrive in chunks, the protocol
|
| - should be able to reconstruct it and to produce the good value.
|
| - """
|
| - d = self.proto.get("foo")
|
| - d.addCallback(self.assertEquals, (0, "0123456789"))
|
| - self.assertEquals(self.transport.value(), "get foo\r\n")
|
| - self.proto.dataReceived("VALUE foo 0 10\r\n0123456")
|
| - self.proto.dataReceived("789")
|
| - self.proto.dataReceived("\r\nEND")
|
| - self.proto.dataReceived("\r\n")
|
| - return d
|
| -
|
| -
|
| - def test_append(self):
|
| - """
|
| - L{MemCacheProtocol.append} behaves like a L{MemCacheProtocol.set}
|
| - method: it should return a L{Deferred} which is called back with
|
| - C{True} when the operation succeeds.
|
| - """
|
| - return self._test(self.proto.append("foo", "bar"),
|
| - "append foo 0 0 3\r\nbar\r\n", "STORED\r\n", True)
|
| -
|
| -
|
| - def test_prepend(self):
|
| - """
|
| - L{MemCacheProtocol.prepend} behaves like a L{MemCacheProtocol.set}
|
| - method: it should return a L{Deferred} which is called back with
|
| - C{True} when the operation succeeds.
|
| - """
|
| - return self._test(self.proto.prepend("foo", "bar"),
|
| - "prepend foo 0 0 3\r\nbar\r\n", "STORED\r\n", True)
|
| -
|
| -
|
| - def test_gets(self):
|
| - """
|
| - L{MemCacheProtocol.get} should handle an additional cas result when
|
| - C{withIdentifier} is C{True} and forward it in the resulting
|
| - L{Deferred}.
|
| - """
|
| - return self._test(self.proto.get("foo", True), "gets foo\r\n",
|
| - "VALUE foo 0 3 1234\r\nbar\r\nEND\r\n", (0, "1234", "bar"))
|
| -
|
| -
|
| - def test_emptyGets(self):
|
| - """
|
| - Test getting a non-available key with gets: it should succeed but
|
| - return C{None} as value, C{0} as flag and an empty cas value.
|
| - """
|
| - return self._test(self.proto.get("foo", True), "gets foo\r\n",
|
| - "END\r\n", (0, "", None))
|
| -
|
| -
|
| - def test_checkAndSet(self):
|
| - """
|
| - L{MemCacheProtocol.checkAndSet} passes an additional cas identifier that the
|
| - server should handle to check if the data has to be updated.
|
| - """
|
| - return self._test(self.proto.checkAndSet("foo", "bar", cas="1234"),
|
| - "cas foo 0 0 3 1234\r\nbar\r\n", "STORED\r\n", True)
|
| -
|
| -
|
| - def test_casUnknowKey(self):
|
| - """
|
| - When L{MemCacheProtocol.checkAndSet} response is C{EXISTS}, the resulting
|
| - L{Deferred} should fire with C{False}.
|
| - """
|
| - return self._test(self.proto.checkAndSet("foo", "bar", cas="1234"),
|
| - "cas foo 0 0 3 1234\r\nbar\r\n", "EXISTS\r\n", False)
|
|
|