Merge Dave's fixes for the compatibility tests and web.
[jelmer/dulwich-libgit2.git] / dulwich / tests / test_file.py
1 # test_file.py -- Test for git files
2 # Copyright (C) 2010 Google, Inc.
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; version 2
7 # of the License or (at your option) a later version of the License.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
17 # MA  02110-1301, USA.
18
19
20 import errno
21 import os
22 import shutil
23 import tempfile
24 import unittest
25
26 from dulwich.file import GitFile
27
28
29 class GitFileTests(unittest.TestCase):
30
31     def setUp(self):
32         self._tempdir = tempfile.mkdtemp()
33         f = open(self.path('foo'), 'wb')
34         f.write('foo contents')
35         f.close()
36
37     def tearDown(self):
38         shutil.rmtree(self._tempdir)
39
40     def path(self, filename):
41         return os.path.join(self._tempdir, filename)
42
43     def test_invalid(self):
44         foo = self.path('foo')
45         self.assertRaises(IOError, GitFile, foo, mode='r')
46         self.assertRaises(IOError, GitFile, foo, mode='ab')
47         self.assertRaises(IOError, GitFile, foo, mode='r+b')
48         self.assertRaises(IOError, GitFile, foo, mode='w+b')
49         self.assertRaises(IOError, GitFile, foo, mode='a+bU')
50
51     def test_readonly(self):
52         f = GitFile(self.path('foo'), 'rb')
53         self.assertTrue(isinstance(f, file))
54         self.assertEquals('foo contents', f.read())
55         self.assertEquals('', f.read())
56         f.seek(4)
57         self.assertEquals('contents', f.read())
58         f.close()
59
60     def test_write(self):
61         foo = self.path('foo')
62         foo_lock = '%s.lock' % foo
63
64         orig_f = open(foo, 'rb')
65         self.assertEquals(orig_f.read(), 'foo contents')
66         orig_f.close()
67
68         self.assertFalse(os.path.exists(foo_lock))
69         f = GitFile(foo, 'wb')
70         self.assertFalse(f.closed)
71         self.assertRaises(AttributeError, getattr, f, 'not_a_file_property')
72
73         self.assertTrue(os.path.exists(foo_lock))
74         f.write('new stuff')
75         f.seek(4)
76         f.write('contents')
77         f.close()
78         self.assertFalse(os.path.exists(foo_lock))
79
80         new_f = open(foo, 'rb')
81         self.assertEquals('new contents', new_f.read())
82         new_f.close()
83
84     def test_open_twice(self):
85         foo = self.path('foo')
86         f1 = GitFile(foo, 'wb')
87         f1.write('new')
88         try:
89             f2 = GitFile(foo, 'wb')
90             fail()
91         except OSError, e:
92             self.assertEquals(errno.EEXIST, e.errno)
93         f1.write(' contents')
94         f1.close()
95
96         # Ensure trying to open twice doesn't affect original.
97         f = open(foo, 'rb')
98         self.assertEquals('new contents', f.read())
99         f.close()
100
101     def test_abort(self):
102         foo = self.path('foo')
103         foo_lock = '%s.lock' % foo
104
105         orig_f = open(foo, 'rb')
106         self.assertEquals(orig_f.read(), 'foo contents')
107         orig_f.close()
108
109         f = GitFile(foo, 'wb')
110         f.write('new contents')
111         f.abort()
112         self.assertTrue(f.closed)
113         self.assertFalse(os.path.exists(foo_lock))
114
115         new_orig_f = open(foo, 'rb')
116         self.assertEquals(new_orig_f.read(), 'foo contents')
117         new_orig_f.close()
118
119     def test_abort_close(self):
120         foo = self.path('foo')
121         f = GitFile(foo, 'wb')
122         f.abort()
123         try:
124             f.close()
125         except (IOError, OSError):
126             self.fail()
127
128         f = GitFile(foo, 'wb')
129         f.close()
130         try:
131             f.abort()
132         except (IOError, OSError):
133             self.fail()