From 2fbf74283d94b946c0d4cdd837aa1a80e2546ebb Mon Sep 17 00:00:00 2001
From: Victor Shyba <victor1984@riseup.net>
Date: Sun, 31 Dec 2017 21:16:04 -0300
Subject: [PATCH] [tests] add a test for incomplete downloaded blob

---
 tests/blobs/test_decrypter_buffer.py | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/tests/blobs/test_decrypter_buffer.py b/tests/blobs/test_decrypter_buffer.py
index f6e03946..db8ca5fa 100644
--- a/tests/blobs/test_decrypter_buffer.py
+++ b/tests/blobs/test_decrypter_buffer.py
@@ -28,6 +28,7 @@ from leap.soledad.client._db.blobs import DecrypterBuffer
 from leap.soledad.client._db.blobs import BlobManager
 from leap.soledad.client._db.blobs import FIXED_REV
 from leap.soledad.client._db.blobs.errors import RetriableTransferError
+from leap.soledad.client._crypto import InvalidBlob
 from leap.soledad.client import _crypto
 
 
@@ -73,13 +74,25 @@ class DecrypterBufferCase(unittest.TestCase):
         yield manager._encrypt_and_upload(self.doc_info.doc_id, fd)
 
     @defer.inlineCallbacks
-    def test_incomplete_decryption(self):
+    def test_incomplete_preamble_decryption(self):
         # SCENARIO: Transport failed and close was called with incomplete data
         # CASE 1: Incomplete preamble
+        # OUTCOME: Raise an error which can trigger a retry on crash recovery
         encrypted = (yield self.blob.encrypt()).getvalue()
         encrypted = encrypted[:20]  # only 20 bytes of preamble arrived
         tag = encrypted[-16:]
         buf = DecrypterBuffer(self.doc_info.doc_id, self.secret, tag)
         buf.write(encrypted)
-        self.assertRaises(RetriableTransferError,
-                          buf.close)
+        self.assertRaises(RetriableTransferError, buf.close)
+
+    @defer.inlineCallbacks
+    def test_incomplete_blob_decryption(self):
+        # SCENARIO: Transport failed and close was called with incomplete data
+        # CASE 1: Incomplete blob of known encryption type
+        # OUTCOME: InvalidBlob. It's safer to assume the tag is invalid
+        encrypted = (yield self.blob.encrypt()).getvalue()
+        encrypted = encrypted[:-20]  # 20 bytes missing
+        tag = encrypted[-16:]
+        buf = DecrypterBuffer(self.doc_info.doc_id, self.secret, tag)
+        buf.write(encrypted)
+        self.assertRaises(InvalidBlob, buf.close)
-- 
GitLab