diff options
author | Lars Wirzenius <liw@liw.fi> | 2012-04-21 12:32:42 +0100 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2012-04-21 12:32:42 +0100 |
commit | 77c4c6fabef940ec017f03725a6e584565e9c5e8 (patch) | |
tree | 76d4d2a8bd0f1782b5ba5b60c3fd92593a4e3e6b | |
parent | 7b377503897b07806590d751b816534ca9a4d38b (diff) | |
download | larch-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__.py | 2 | ||||
-rw-r--r-- | larch/journal.py | 9 | ||||
-rw-r--r-- | larch/journal_tests.py | 53 | ||||
-rw-r--r-- | larch/nodestore_disk.py | 2 |
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) |