From c8e8993ec2bfbd5498a6a08a4124a739721b806f Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 11 Aug 2016 00:15:22 +0200 Subject: [PATCH 01/10] Refactor: Move common code into BaseFileSystemTest --- radicale/tests/test_base.py | 58 +++++++++++++++---------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/radicale/tests/test_base.py b/radicale/tests/test_base.py index acb06ff..8312c25 100644 --- a/radicale/tests/test_base.py +++ b/radicale/tests/test_base.py @@ -30,14 +30,8 @@ from . import BaseTest from .helpers import get_file_content -class BaseRequests: +class BaseRequestsMixIn: """Tests with simple requests.""" - storage_type = None - - def setup(self): - self.configuration = config.load() - self.configuration.set("storage", "type", self.storage_type) - self.logger = logging.getLogger("radicale_test") def test_root(self): """GET request at "/".""" @@ -718,33 +712,29 @@ class BaseRequests: assert "href>/calendar.ics/journal2.ics Date: Thu, 11 Aug 2016 00:19:28 +0200 Subject: [PATCH 02/10] Don't run all tests twice Only verify that custom backend loading works with a simple test. --- radicale/tests/test_base.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/radicale/tests/test_base.py b/radicale/tests/test_base.py index 8312c25..05d45e7 100644 --- a/radicale/tests/test_base.py +++ b/radicale/tests/test_base.py @@ -735,6 +735,10 @@ class TestMultiFileSystem(BaseFileSystemTest, BaseRequestsMixIn): storage_type = "multifilesystem" -class TestCustomStorageSystem(BaseFileSystemTest, BaseRequestsMixIn): - """Test BaseRequests on custom backend.""" - storage_type = "tests.custom.storage" \ No newline at end of file +class TestCustomStorageSystem(BaseFileSystemTest): + """Test custom backend loading.""" + storage_type = "tests.custom.storage" + + def test_root(self): + """A simple test to verify that the custom backend works.""" + BaseRequestsMixIn.test_root(self) From 62892e3423561b6a3f471674574546f60173c0a8 Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 11 Aug 2016 00:20:48 +0200 Subject: [PATCH 03/10] Test PROPPATCH --- radicale/tests/static/propfind1.xml | 6 ++++++ radicale/tests/static/proppatch1.xml | 8 ++++++++ radicale/tests/test_base.py | 17 +++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 radicale/tests/static/propfind1.xml create mode 100644 radicale/tests/static/proppatch1.xml diff --git a/radicale/tests/static/propfind1.xml b/radicale/tests/static/propfind1.xml new file mode 100644 index 0000000..1535f7f --- /dev/null +++ b/radicale/tests/static/propfind1.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/radicale/tests/static/proppatch1.xml b/radicale/tests/static/proppatch1.xml new file mode 100644 index 0000000..c549dec --- /dev/null +++ b/radicale/tests/static/proppatch1.xml @@ -0,0 +1,8 @@ + + + + + #BADA55 + + + \ No newline at end of file diff --git a/radicale/tests/test_base.py b/radicale/tests/test_base.py index 05d45e7..4ae2168 100644 --- a/radicale/tests/test_base.py +++ b/radicale/tests/test_base.py @@ -213,6 +213,23 @@ class BaseRequestsMixIn: assert "href>%s%s#BADA55 Date: Thu, 11 Aug 2016 00:23:05 +0200 Subject: [PATCH 04/10] Test implicit creation of principal collection Test for 81b04890f1157922005aa1d4139bfab9a7d3a5df --- radicale/tests/test_base.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/radicale/tests/test_base.py b/radicale/tests/test_base.py index 4ae2168..dc3c70f 100644 --- a/radicale/tests/test_base.py +++ b/radicale/tests/test_base.py @@ -728,6 +728,12 @@ class BaseRequestsMixIn: assert "href>/calendar.ics/journal1.ics/calendar.ics/journal2.ics Date: Thu, 11 Aug 2016 00:24:37 +0200 Subject: [PATCH 05/10] Test that the root collection always exists Test for 6c3e59fd11400734a8b9ec9942858724a36e3f1d --- radicale/tests/test_base.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/radicale/tests/test_base.py b/radicale/tests/test_base.py index dc3c70f..60ac52e 100644 --- a/radicale/tests/test_base.py +++ b/radicale/tests/test_base.py @@ -734,6 +734,16 @@ class BaseRequestsMixIn: "GET", "/user/", REMOTE_USER="user") assert status == 200 + def test_existence_of_root_collections(self): + """Verify that the root collection always exists.""" + # Use PROPFIND because GET returns message + status, headers, answer = self.request("PROPFIND", "/") + assert status == 207 + # it should still exist after deletion + self.request("DELETE", "/") + status, headers, answer = self.request("PROPFIND", "/") + assert status == 207 + class BaseFileSystemTest(BaseTest): """Base class for filesystem backend tests.""" From 893051645e73a3187d306cacf7e0e2b116c2291b Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 11 Aug 2016 00:25:13 +0200 Subject: [PATCH 06/10] Test fsync Enable syncing for at least one test. Test for 5c2075cb6cb23b15fe3a3bee5b69416a6aed6fa2. --- radicale/tests/test_base.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/radicale/tests/test_base.py b/radicale/tests/test_base.py index 60ac52e..bb3047d 100644 --- a/radicale/tests/test_base.py +++ b/radicale/tests/test_base.py @@ -744,6 +744,12 @@ class BaseRequestsMixIn: status, headers, answer = self.request("PROPFIND", "/") assert status == 207 + def test_fsync(self): + """Create a directory and file with syncing enabled.""" + self.configuration.set("storage", "fsync", "True") + status, headers, answer = self.request("MKCALENDAR", "/calendar.ics/") + assert status == 201 + class BaseFileSystemTest(BaseTest): """Base class for filesystem backend tests.""" From 952609deeeb8b1c064654be7ac0d5efb60589756 Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 11 Aug 2016 00:26:51 +0200 Subject: [PATCH 07/10] Test that hook gets executed on write accesses --- radicale/tests/test_base.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/radicale/tests/test_base.py b/radicale/tests/test_base.py index bb3047d..88b1cec 100644 --- a/radicale/tests/test_base.py +++ b/radicale/tests/test_base.py @@ -20,6 +20,7 @@ Radicale tests with simple requests. """ import logging +import os import posixpath import shutil import tempfile @@ -750,6 +751,26 @@ class BaseRequestsMixIn: status, headers, answer = self.request("MKCALENDAR", "/calendar.ics/") assert status == 201 + def test_hook(self): + """Run hook.""" + self.configuration.set( + "storage", "hook", "mkdir %s" % os.path.join("collection-root", + "created_by_hook")) + status, headers, answer = self.request("MKCOL", "/calendar.ics/") + assert status == 201 + status, headers, answer = self.request("GET", "/created_by_hook/") + assert status == 200 + + def test_hook_read_access(self): + """Verify that hook is not run for read accesses.""" + self.configuration.set( + "storage", "hook", "mkdir %s" % os.path.join("collection-root", + "created_by_hook")) + status, headers, answer = self.request("GET", "/") + assert status == 200 + status, headers, answer = self.request("GET", "/created_by_hook/") + assert status == 404 + class BaseFileSystemTest(BaseTest): """Base class for filesystem backend tests.""" From 080ed31d2721605af7b1f9428e1f93fda13d3162 Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 11 Aug 2016 00:27:48 +0200 Subject: [PATCH 08/10] Test that storage is locked when hook runs Test for 65af0592d339e0d40ed9a688627feb91b020baae --- radicale/tests/test_base.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/radicale/tests/test_base.py b/radicale/tests/test_base.py index 88b1cec..ecac00e 100644 --- a/radicale/tests/test_base.py +++ b/radicale/tests/test_base.py @@ -25,6 +25,7 @@ import posixpath import shutil import tempfile +import pytest from radicale import Application, config from . import BaseTest @@ -771,6 +772,15 @@ class BaseRequestsMixIn: status, headers, answer = self.request("GET", "/created_by_hook/") assert status == 404 + @pytest.mark.skipif(os.system("type flock") != 0, + reason="flock command not found") + def test_hook_storage_locked(self): + """Verify that the storage is locked when the hook runs.""" + self.configuration.set( + "storage", "hook", "flock -n .Radicale.lock || exit 0; exit 1") + status, headers, answer = self.request("MKCOL", "/calendar.ics/") + assert status == 201 + class BaseFileSystemTest(BaseTest): """Base class for filesystem backend tests.""" From 2b45cffa0e7d0ccd550a2ce6b1dfcc6fc5834cfc Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 11 Aug 2016 00:29:12 +0200 Subject: [PATCH 09/10] Test that hook gets executed when the principal collection is created Test for ee5b8facda0e27ed543eef8351731838978751a1 --- radicale/tests/test_base.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/radicale/tests/test_base.py b/radicale/tests/test_base.py index ecac00e..b1c0790 100644 --- a/radicale/tests/test_base.py +++ b/radicale/tests/test_base.py @@ -781,6 +781,16 @@ class BaseRequestsMixIn: status, headers, answer = self.request("MKCOL", "/calendar.ics/") assert status == 201 + def test_hook_principal_collection_creation(self): + """Verify that the hooks runs when a new user is created.""" + self.configuration.set( + "storage", "hook", "mkdir %s" % os.path.join("collection-root", + "created_by_hook")) + status, headers, answer = self.request("GET", "/", REMOTE_USER="user") + assert status == 200 + status, headers, answer = self.request("GET", "/created_by_hook/") + assert status == 200 + class BaseFileSystemTest(BaseTest): """Base class for filesystem backend tests.""" From 30b3273efa95ea2f0dd1d245411702db41ba46b6 Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 11 Aug 2016 00:31:34 +0200 Subject: [PATCH 10/10] Test that the requests fails if the hook fails --- radicale/tests/test_base.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/radicale/tests/test_base.py b/radicale/tests/test_base.py index b1c0790..2e39fc4 100644 --- a/radicale/tests/test_base.py +++ b/radicale/tests/test_base.py @@ -791,6 +791,15 @@ class BaseRequestsMixIn: status, headers, answer = self.request("GET", "/created_by_hook/") assert status == 200 + def test_hook_fail(self): + """Verify that a request fails if the hook fails.""" + self.configuration.set("storage", "hook", "exit 1") + try: + status, headers, answer = self.request("MKCOL", "/calendar.ics/") + assert status != 201 + except Exception: + pass + class BaseFileSystemTest(BaseTest): """Base class for filesystem backend tests."""