a test that "verifies" that the file renaming lock works and no inconsistencies are created.

This commit is contained in:
jonaswinkler 2020-12-08 21:08:44 +01:00
parent e428a8a008
commit 550a74347c
2 changed files with 48 additions and 1 deletions

View File

@ -206,6 +206,8 @@ class Consumer(LoggingMixin):
document.archive_checksum = hashlib.md5( document.archive_checksum = hashlib.md5(
f.read()).hexdigest() f.read()).hexdigest()
# Don't save with the lock active. Saving will cause the file
# renaming logic to aquire the lock as well.
document.save() document.save()
# Delete the file only if it was successfully consumed # Delete the file only if it was successfully consumed

View File

@ -1,5 +1,9 @@
import datetime import datetime
import hashlib
import os import os
import random
import uuid
from concurrent.futures.thread import ThreadPoolExecutor
from pathlib import Path from pathlib import Path
from unittest import mock from unittest import mock
@ -8,8 +12,10 @@ from django.db import DatabaseError
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
from .utils import DirectoriesMixin from .utils import DirectoriesMixin
from ..file_handling import generate_filename, create_source_path_directory, delete_empty_directories from ..file_handling import generate_filename, create_source_path_directory, delete_empty_directories, \
generate_unique_filename
from ..models import Document, Correspondent from ..models import Document, Correspondent
from ..sanity_checker import check_sanity
class TestFileHandling(DirectoriesMixin, TestCase): class TestFileHandling(DirectoriesMixin, TestCase):
@ -546,3 +552,42 @@ class TestFilenameGeneration(TestCase):
def test_date(self): def test_date(self):
doc = Document.objects.create(title="does not matter", created=datetime.datetime(2020,5,21, 7,36,51, 153), mime_type="application/pdf", pk=2, checksum="2") doc = Document.objects.create(title="does not matter", created=datetime.datetime(2020,5,21, 7,36,51, 153), mime_type="application/pdf", pk=2, checksum="2")
self.assertEqual(generate_filename(doc), "2020-05-21.pdf") self.assertEqual(generate_filename(doc), "2020-05-21.pdf")
def run():
doc = Document.objects.create(checksum=str(uuid.uuid4()), title=str(uuid.uuid4()), content="wow")
doc.filename = generate_unique_filename(doc, settings.ORIGINALS_DIR)
Path(doc.thumbnail_path).touch()
with open(doc.source_path, "w") as f:
f.write(str(uuid.uuid4()))
with open(doc.source_path, "rb") as f:
doc.checksum = hashlib.md5(f.read()).hexdigest()
with open(doc.archive_path, "w") as f:
f.write(str(uuid.uuid4()))
with open(doc.archive_path, "rb") as f:
doc.archive_checksum = hashlib.md5(f.read()).hexdigest()
doc.save()
for i in range(30):
doc.title = str(random.randrange(1, 5))
doc.save()
class TestSuperMassive(DirectoriesMixin, TestCase):
@override_settings(PAPERLESS_FILENAME_FORMAT="{title}")
def test_super_massive(self):
# try to save as many documents in parallel as possible.
# try to make the system fail.
with ThreadPoolExecutor(max_workers=16) as executor:
results = [executor.submit(run) for i in range(16)]
for r in results:
if r.exception():
raise r.exception()
# nope, everything still good. Thank you, lockfiles.
self.assertEqual(len(check_sanity()), 0)