~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_lock.py

Add some basic locking tests which should currently pass on all platforms.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2007 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
17
"""Tests for OS level locks."""
 
18
 
 
19
from bzrlib import (
 
20
    lock,
 
21
    tests,
 
22
    )
 
23
 
 
24
 
 
25
class TestLock(tests.TestCaseInTempDir):
 
26
 
 
27
    def setUp(self):
 
28
        super(TestLock, self).setUp()
 
29
        self.build_tree(['a-file'])
 
30
 
 
31
    def test_read_lock(self):
 
32
        """Smoke test for read locks."""
 
33
        a_lock = lock.ReadLock('a-file')
 
34
        self.addCleanup(a_lock.unlock)
 
35
        # The lock file should be opened for reading
 
36
        txt = a_lock.f.read()
 
37
        self.assertEqual('contents of a-file\n', txt)
 
38
 
 
39
    def test_create_if_needed_read(self):
 
40
        """We will create the file if it doesn't exist yet."""
 
41
        a_lock = lock.ReadLock('other-file')
 
42
        self.addCleanup(a_lock.unlock)
 
43
        txt = a_lock.f.read()
 
44
        self.assertEqual('', txt)
 
45
 
 
46
    def test_create_if_needed_write(self):
 
47
        """We will create the file if it doesn't exist yet."""
 
48
        a_lock = lock.WriteLock('other-file')
 
49
        self.addCleanup(a_lock.unlock)
 
50
        txt = a_lock.f.read()
 
51
        self.assertEqual('', txt)
 
52
        a_lock.f.write('foo\n')
 
53
        a_lock.f.seek(0)
 
54
        txt = a_lock.f.read()
 
55
        self.assertEqual('foo\n', txt)
 
56
 
 
57
    def test_write_lock(self):
 
58
        """Smoke test for write locks."""
 
59
        a_lock = lock.WriteLock('a-file')
 
60
        self.addCleanup(a_lock.unlock)
 
61
        # You should be able to read and write to the lock file.
 
62
        txt = a_lock.f.read()
 
63
        self.assertEqual('contents of a-file\n', txt)
 
64
        a_lock.f.write('more content\n')
 
65
        a_lock.f.seek(0)
 
66
        txt = a_lock.f.read()
 
67
        self.assertEqual('contents of a-file\nmore content\n', txt)
 
68
 
 
69
    def test_multiple_read_locks(self):
 
70
        """You can take out more than one read lock on the same file."""
 
71
        a_lock = lock.ReadLock('a-file')
 
72
        self.addCleanup(a_lock.unlock)
 
73
        b_lock = lock.ReadLock('a-file')
 
74
        self.addCleanup(b_lock.unlock)
 
75