/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
1
# Copyright (C) 2006 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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
16
17
"""Basic tests for AtomicFile"""
18
19
import os
20
import stat
21
import sys
22
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
23
from .. import (
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
24
    atomicfile,
25
    errors,
1755.3.9 by John Arbash Meinel
Make AtomicFile not do anything if not supplied a mode, clean up LocalTransport now that we do the right thing for None
26
    osutils,
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
27
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
28
from . import TestCaseInTempDir, TestSkipped
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
29
30
31
class TestAtomicFile(TestCaseInTempDir):
32
33
    def test_commit(self):
34
        f = atomicfile.AtomicFile('test')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
35
        self.assertPathDoesNotExist('test')
6855.4.5 by Jelmer Vernooij
Fix more bees, use with rather than try/finally for some files.
36
        f.write(b'foo\n')
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
37
        f.commit()
38
39
        self.assertEqual(['test'], os.listdir('.'))
6973.10.4 by Jelmer Vernooij
Update python3.passing.
40
        self.check_file_contents('test', b'foo\n')
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
41
        self.assertRaises(errors.AtomicFileAlreadyClosed, f.commit)
42
        self.assertRaises(errors.AtomicFileAlreadyClosed, f.abort)
43
        # close is re-entrant safe
44
        f.close()
45
46
    def test_abort(self):
47
        f = atomicfile.AtomicFile('test')
6855.4.5 by Jelmer Vernooij
Fix more bees, use with rather than try/finally for some files.
48
        f.write(b'foo\n')
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
49
        f.abort()
50
        self.assertEqual([], os.listdir('.'))
51
52
        self.assertRaises(errors.AtomicFileAlreadyClosed, f.abort)
53
        self.assertRaises(errors.AtomicFileAlreadyClosed, f.commit)
54
55
        # close is re-entrant safe
56
        f.close()
57
58
    def test_close(self):
59
        f = atomicfile.AtomicFile('test')
6855.4.5 by Jelmer Vernooij
Fix more bees, use with rather than try/finally for some files.
60
        f.write(b'foo\n')
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
61
        # close on an open file is an abort
62
        f.close()
63
        self.assertEqual([], os.listdir('.'))
64
65
        self.assertRaises(errors.AtomicFileAlreadyClosed, f.abort)
66
        self.assertRaises(errors.AtomicFileAlreadyClosed, f.commit)
67
68
        # close is re-entrant safe
69
        f.close()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
70
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
71
    def test_text_mode(self):
72
        f = atomicfile.AtomicFile('test', mode='wt')
6855.4.5 by Jelmer Vernooij
Fix more bees, use with rather than try/finally for some files.
73
        f.write(b'foo\n')
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
74
        f.commit()
75
76
        contents = open('test', 'rb').read()
77
        if sys.platform == 'win32':
7027.3.3 by Jelmer Vernooij
Add some more bees; support writing both bytes and unicode strings in build_tree_contents.
78
            self.assertEqual(b'foo\r\n', contents)
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
79
        else:
7027.3.3 by Jelmer Vernooij
Add some more bees; support writing both bytes and unicode strings in build_tree_contents.
80
            self.assertEqual(b'foo\n', contents)
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
81
82
    def can_sys_preserve_mode(self):
83
        # PLATFORM DEFICIENCY/ TestSkipped
84
        return sys.platform not in ('win32',)
85
86
    def _test_mode(self, mode):
87
        if not self.can_sys_preserve_mode():
1982.1.1 by Alexander Belchenko
Explicitly skip tests with file attribute manipulations instead of silently pass
88
            raise TestSkipped("This test cannot be run on your platform")
1755.3.9 by John Arbash Meinel
Make AtomicFile not do anything if not supplied a mode, clean up LocalTransport now that we do the right thing for None
89
        f = atomicfile.AtomicFile('test', mode='wb', new_mode=mode)
6855.4.5 by Jelmer Vernooij
Fix more bees, use with rather than try/finally for some files.
90
        f.write(b'foo\n')
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
91
        f.commit()
92
        st = os.lstat('test')
93
        self.assertEqualMode(mode, stat.S_IMODE(st.st_mode))
94
95
    def test_mode_0666(self):
6619.3.14 by Jelmer Vernooij
Convert some octal numbers to new notations.
96
        self._test_mode(0o666)
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
97
98
    def test_mode_0664(self):
6619.3.14 by Jelmer Vernooij
Convert some octal numbers to new notations.
99
        self._test_mode(0o664)
100
101
    def test_mode_0660(self):
102
        self._test_mode(0o660)
103
104
    def test_mode_0660(self):
105
        self._test_mode(0o660)
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
106
107
    def test_mode_0640(self):
6619.3.14 by Jelmer Vernooij
Convert some octal numbers to new notations.
108
        self._test_mode(0o640)
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
109
110
    def test_mode_0600(self):
6619.3.14 by Jelmer Vernooij
Convert some octal numbers to new notations.
111
        self._test_mode(0o600)
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
112
113
    def test_mode_0400(self):
6619.3.14 by Jelmer Vernooij
Convert some octal numbers to new notations.
114
        self._test_mode(0o400)
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
115
        # Make it read-write again so cleanup doesn't complain
6619.3.14 by Jelmer Vernooij
Convert some octal numbers to new notations.
116
        os.chmod('test', 0o600)
1755.3.9 by John Arbash Meinel
Make AtomicFile not do anything if not supplied a mode, clean up LocalTransport now that we do the right thing for None
117
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')
6855.4.5 by Jelmer Vernooij
Fix more bees, use with rather than try/finally for some files.
122
        f.write(b'foo\n')
1755.3.9 by John Arbash Meinel
Make AtomicFile not do anything if not supplied a mode, clean up LocalTransport now that we do the right thing for None
123
        f.commit()
124
        st = os.lstat('test')
6619.3.14 by Jelmer Vernooij
Convert some octal numbers to new notations.
125
        self.assertEqualMode(0o666 & ~umask, stat.S_IMODE(st.st_mode))