summaryrefslogtreecommitdiff
path: root/tests/test_receiver.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_receiver.py')
-rw-r--r--tests/test_receiver.py242
1 files changed, 242 insertions, 0 deletions
diff --git a/tests/test_receiver.py b/tests/test_receiver.py
new file mode 100644
index 0000000..b4910bb
--- /dev/null
+++ b/tests/test_receiver.py
@@ -0,0 +1,242 @@
+import unittest
+
+
+class TestFixedStreamReceiver(unittest.TestCase):
+ def _makeOne(self, cl, buf):
+ from waitress.receiver import FixedStreamReceiver
+
+ return FixedStreamReceiver(cl, buf)
+
+ def test_received_remain_lt_1(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(0, buf)
+ result = inst.received("a")
+ self.assertEqual(result, 0)
+ self.assertEqual(inst.completed, True)
+
+ def test_received_remain_lte_datalen(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(1, buf)
+ result = inst.received("aa")
+ self.assertEqual(result, 1)
+ self.assertEqual(inst.completed, True)
+ self.assertEqual(inst.completed, 1)
+ self.assertEqual(inst.remain, 0)
+ self.assertEqual(buf.data, ["a"])
+
+ def test_received_remain_gt_datalen(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(10, buf)
+ result = inst.received("aa")
+ self.assertEqual(result, 2)
+ self.assertEqual(inst.completed, False)
+ self.assertEqual(inst.remain, 8)
+ self.assertEqual(buf.data, ["aa"])
+
+ def test_getfile(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(10, buf)
+ self.assertEqual(inst.getfile(), buf)
+
+ def test_getbuf(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(10, buf)
+ self.assertEqual(inst.getbuf(), buf)
+
+ def test___len__(self):
+ buf = DummyBuffer(["1", "2"])
+ inst = self._makeOne(10, buf)
+ self.assertEqual(inst.__len__(), 2)
+
+
+class TestChunkedReceiver(unittest.TestCase):
+ def _makeOne(self, buf):
+ from waitress.receiver import ChunkedReceiver
+
+ return ChunkedReceiver(buf)
+
+ def test_alreadycompleted(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ inst.completed = True
+ result = inst.received(b"a")
+ self.assertEqual(result, 0)
+ self.assertEqual(inst.completed, True)
+
+ def test_received_remain_gt_zero(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ inst.chunk_remainder = 100
+ result = inst.received(b"a")
+ self.assertEqual(inst.chunk_remainder, 99)
+ self.assertEqual(result, 1)
+ self.assertEqual(inst.completed, False)
+
+ def test_received_control_line_notfinished(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ result = inst.received(b"a")
+ self.assertEqual(inst.control_line, b"a")
+ self.assertEqual(result, 1)
+ self.assertEqual(inst.completed, False)
+
+ def test_received_control_line_finished_garbage_in_input(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ result = inst.received(b"garbage\r\n")
+ self.assertEqual(result, 9)
+ self.assertTrue(inst.error)
+
+ def test_received_control_line_finished_all_chunks_not_received(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ result = inst.received(b"a;discard\r\n")
+ self.assertEqual(inst.control_line, b"")
+ self.assertEqual(inst.chunk_remainder, 10)
+ self.assertEqual(inst.all_chunks_received, False)
+ self.assertEqual(result, 11)
+ self.assertEqual(inst.completed, False)
+
+ def test_received_control_line_finished_all_chunks_received(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ result = inst.received(b"0;discard\r\n")
+ self.assertEqual(inst.control_line, b"")
+ self.assertEqual(inst.all_chunks_received, True)
+ self.assertEqual(result, 11)
+ self.assertEqual(inst.completed, False)
+
+ def test_received_trailer_startswith_crlf(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ inst.all_chunks_received = True
+ result = inst.received(b"\r\n")
+ self.assertEqual(result, 2)
+ self.assertEqual(inst.completed, True)
+
+ def test_received_trailer_startswith_lf(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ inst.all_chunks_received = True
+ result = inst.received(b"\n")
+ self.assertEqual(result, 1)
+ self.assertEqual(inst.completed, False)
+
+ def test_received_trailer_not_finished(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ inst.all_chunks_received = True
+ result = inst.received(b"a")
+ self.assertEqual(result, 1)
+ self.assertEqual(inst.completed, False)
+
+ def test_received_trailer_finished(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ inst.all_chunks_received = True
+ result = inst.received(b"abc\r\n\r\n")
+ self.assertEqual(inst.trailer, b"abc\r\n\r\n")
+ self.assertEqual(result, 7)
+ self.assertEqual(inst.completed, True)
+
+ def test_getfile(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ self.assertEqual(inst.getfile(), buf)
+
+ def test_getbuf(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ self.assertEqual(inst.getbuf(), buf)
+
+ def test___len__(self):
+ buf = DummyBuffer(["1", "2"])
+ inst = self._makeOne(buf)
+ self.assertEqual(inst.__len__(), 2)
+
+ def test_received_chunk_is_properly_terminated(self):
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ data = b"4\r\nWiki\r\n"
+ result = inst.received(data)
+ self.assertEqual(result, len(data))
+ self.assertEqual(inst.completed, False)
+ self.assertEqual(buf.data[0], b"Wiki")
+
+ def test_received_chunk_not_properly_terminated(self):
+ from waitress.utilities import BadRequest
+
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ data = b"4\r\nWikibadchunk\r\n"
+ result = inst.received(data)
+ self.assertEqual(result, len(data))
+ self.assertEqual(inst.completed, False)
+ self.assertEqual(buf.data[0], b"Wiki")
+ self.assertEqual(inst.error.__class__, BadRequest)
+
+ def test_received_multiple_chunks(self):
+ from waitress.utilities import BadRequest
+
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ data = (
+ b"4\r\n"
+ b"Wiki\r\n"
+ b"5\r\n"
+ b"pedia\r\n"
+ b"E\r\n"
+ b" in\r\n"
+ b"\r\n"
+ b"chunks.\r\n"
+ b"0\r\n"
+ b"\r\n"
+ )
+ result = inst.received(data)
+ self.assertEqual(result, len(data))
+ self.assertEqual(inst.completed, True)
+ self.assertEqual(b"".join(buf.data), b"Wikipedia in\r\n\r\nchunks.")
+ self.assertEqual(inst.error, None)
+
+ def test_received_multiple_chunks_split(self):
+ from waitress.utilities import BadRequest
+
+ buf = DummyBuffer()
+ inst = self._makeOne(buf)
+ data1 = b"4\r\nWiki\r"
+ result = inst.received(data1)
+ self.assertEqual(result, len(data1))
+
+ data2 = (
+ b"\n5\r\n"
+ b"pedia\r\n"
+ b"E\r\n"
+ b" in\r\n"
+ b"\r\n"
+ b"chunks.\r\n"
+ b"0\r\n"
+ b"\r\n"
+ )
+
+ result = inst.received(data2)
+ self.assertEqual(result, len(data2))
+
+ self.assertEqual(inst.completed, True)
+ self.assertEqual(b"".join(buf.data), b"Wikipedia in\r\n\r\nchunks.")
+ self.assertEqual(inst.error, None)
+
+
+class DummyBuffer(object):
+ def __init__(self, data=None):
+ if data is None:
+ data = []
+ self.data = data
+
+ def append(self, s):
+ self.data.append(s)
+
+ def getfile(self):
+ return self
+
+ def __len__(self):
+ return len(self.data)