summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2012-04-21 12:32:42 +0100
committerLars Wirzenius <liw@liw.fi>2012-04-21 12:32:42 +0100
commit77c4c6fabef940ec017f03725a6e584565e9c5e8 (patch)
tree76d4d2a8bd0f1782b5ba5b60c3fd92593a4e3e6b
parent7b377503897b07806590d751b816534ca9a4d38b (diff)
downloadlarch-77c4c6fabef940ec017f03725a6e584565e9c5e8.tar.gz
Add tests for a read-only mode for the journal
This will be necessary for a read-only mode Larch in general.
-rw-r--r--larch/__init__.py2
-rw-r--r--larch/journal.py9
-rw-r--r--larch/journal_tests.py53
-rw-r--r--larch/nodestore_disk.py2
4 files changed, 62 insertions, 4 deletions
diff --git a/larch/__init__.py b/larch/__init__.py
index cc83b85..52b02d4 100644
--- a/larch/__init__.py
+++ b/larch/__init__.py
@@ -27,7 +27,7 @@ from refcountstore import RefcountStore
from lru import LRUCache
from uploadqueue import UploadQueue
from idpath import IdPath
-from journal import Journal
+from journal import Journal, ReadOnlyMode
from nodestore_disk import NodeStoreDisk, LocalFS, FormatProblem
from nodestore_memory import NodeStoreMemory
diff --git a/larch/journal.py b/larch/journal.py
index ff6498d..1c18056 100644
--- a/larch/journal.py
+++ b/larch/journal.py
@@ -20,6 +20,12 @@ import os
import tracing
+class ReadOnlyMode(Exception):
+
+ def __str__(self):
+ return 'Larch B-tree is in read-only mode, no changes allowed'
+
+
class Journal(object):
'''A journal layer on top of a virtual filesystem.
@@ -58,8 +64,9 @@ class Journal(object):
flag_basename = 'metadata'
- def __init__(self, fs, storedir):
+ def __init__(self, allow_writes, fs, storedir):
logging.debug('Initializing Journal for %s' % storedir)
+ self.allow_writes = allow_writes
self.fs = fs
self.storedir = storedir
if not self.storedir.endswith(os.sep):
diff --git a/larch/journal_tests.py b/larch/journal_tests.py
index 8d55b57..ac6f0ce 100644
--- a/larch/journal_tests.py
+++ b/larch/journal_tests.py
@@ -27,7 +27,7 @@ class JournalTests(unittest.TestCase):
def setUp(self):
self.tempdir = tempfile.mkdtemp()
self.fs = larch.LocalFS()
- self.j = larch.Journal(self.fs, self.tempdir)
+ self.j = larch.Journal(True, self.fs, self.tempdir)
def tearDown(self):
shutil.rmtree(self.tempdir)
@@ -175,3 +175,54 @@ class JournalTests(unittest.TestCase):
j2 = larch.Journal(self.fs, self.tempdir)
self.assertTrue(j2.exists(filename))
+
+class ReadOnlyJournalTests(unittest.TestCase):
+
+ def setUp(self):
+ self.tempdir = tempfile.mkdtemp()
+ self.fs = larch.LocalFS()
+ self.rw = larch.Journal(True, self.fs, self.tempdir)
+ self.ro = larch.Journal(False, self.fs, self.tempdir)
+
+ def tearDown(self):
+ shutil.rmtree(self.tempdir)
+
+ def join(self, *args):
+ return os.path.join(self.tempdir, *args)
+
+ def test_does_not_know_random_directory_initially(self):
+ self.assertFalse(self.ro.exists(self.join('foo')))
+
+ def test_creating_directory_raises_error(self):
+ self.assertRaises(larch.ReadOnlyMode, self.ro.makedirs, 'foo')
+
+ def test_calling_rollback_raises_error(self):
+ self.assertRaises(larch.ReadOnlyMode, self.ro.rollback)
+
+ def test_readonly_mode_does_not_check_for_directory_creation(self):
+ dirname = self.rw.join('foo/bar')
+ self.rw.makedirs(dirname)
+ self.assertFalse(self.ro.exists(dirname))
+
+ def test_write_file_raisees_error(self):
+ self.assertRaises(larch.ReadOnlyMode,
+ self.ro.overwrite_file, 'foo', 'bar')
+
+ def test_readonly_mode_does_not_check_for_new_file(self):
+ self.rw.ovewrite_file('foo', 'bar')
+ self.assertFalse(self.ro.exists('foo'))
+
+ def test_readonly_mode_does_not_check_for_modified_file(self):
+ self.rw.ovewrite_file('foo', 'first')
+ self.rw.commit()
+ self.assertEqual(self.ro.cat('foo'), 'first')
+ self.rw.ovewrite_file('foo', 'second')
+ self.assertEqual(self.ro.cat('foo'), 'first')
+
+ def test_readonly_mode_does_not_know_file_is_deleted_in_journal(self):
+ filename = self.join('foo/bar')
+ self.rw.overwrite_file(filename, 'bar')
+ self.rw.commit()
+ self.rw.remove(filename)
+ self.assertEqual(self.ro.cat(filename), 'bar')
+
diff --git a/larch/nodestore_disk.py b/larch/nodestore_disk.py
index 01cae30..c216f50 100644
--- a/larch/nodestore_disk.py
+++ b/larch/nodestore_disk.py
@@ -130,7 +130,7 @@ class NodeStoreDisk(larch.NodeStore):
self.upload_queue = larch.UploadQueue(self._really_put_node,
self.upload_max)
self.vfs = vfs if vfs != None else LocalFS()
- self.journal = larch.Journal(self.vfs, dirname)
+ self.journal = larch.Journal(True, self.vfs, dirname)
self.idpath = larch.IdPath(os.path.join(dirname, self.nodedir),
DIR_DEPTH, DIR_BITS, DIR_SKIP)