1
# Copyright (C) 2006 Canonical Ltd
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.
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.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
"""Basic tests for AtomicFile"""
28
from . import TestCaseInTempDir, TestSkipped
31
class TestAtomicFile(TestCaseInTempDir):
33
def test_commit(self):
34
f = atomicfile.AtomicFile('test')
35
self.assertPathDoesNotExist('test')
39
self.assertEqual(['test'], os.listdir('.'))
40
self.check_file_contents('test', 'foo\n')
41
self.assertRaises(errors.AtomicFileAlreadyClosed, f.commit)
42
self.assertRaises(errors.AtomicFileAlreadyClosed, f.abort)
43
# close is re-entrant safe
47
f = atomicfile.AtomicFile('test')
50
self.assertEqual([], os.listdir('.'))
52
self.assertRaises(errors.AtomicFileAlreadyClosed, f.abort)
53
self.assertRaises(errors.AtomicFileAlreadyClosed, f.commit)
55
# close is re-entrant safe
59
f = atomicfile.AtomicFile('test')
61
# close on an open file is an abort
63
self.assertEqual([], os.listdir('.'))
65
self.assertRaises(errors.AtomicFileAlreadyClosed, f.abort)
66
self.assertRaises(errors.AtomicFileAlreadyClosed, f.commit)
68
# close is re-entrant safe
71
def test_text_mode(self):
72
f = atomicfile.AtomicFile('test', mode='wt')
76
contents = open('test', 'rb').read()
77
if sys.platform == 'win32':
78
self.assertEqual('foo\r\n', contents)
80
self.assertEqual('foo\n', contents)
82
def can_sys_preserve_mode(self):
83
# PLATFORM DEFICIENCY/ TestSkipped
84
return sys.platform not in ('win32',)
86
def _test_mode(self, mode):
87
if not self.can_sys_preserve_mode():
88
raise TestSkipped("This test cannot be run on your platform")
89
f = atomicfile.AtomicFile('test', mode='wb', new_mode=mode)
93
self.assertEqualMode(mode, stat.S_IMODE(st.st_mode))
95
def test_mode_0666(self):
96
self._test_mode(0o666)
98
def test_mode_0664(self):
99
self._test_mode(0o664)
101
def test_mode_0660(self):
102
self._test_mode(0o660)
104
def test_mode_0660(self):
105
self._test_mode(0o660)
107
def test_mode_0640(self):
108
self._test_mode(0o640)
110
def test_mode_0600(self):
111
self._test_mode(0o600)
113
def test_mode_0400(self):
114
self._test_mode(0o400)
115
# Make it read-write again so cleanup doesn't complain
116
os.chmod('test', 0o600)
118
def test_no_mode(self):
119
# The default file permissions should be based on umask
120
umask = osutils.get_umask()
121
f = atomicfile.AtomicFile('test', mode='wb')
124
st = os.lstat('test')
125
self.assertEqualMode(0o666 & ~umask, stat.S_IMODE(st.st_mode))