~bzr-pqm/bzr/bzr.dev

6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2006, 2007, 2009, 2011, 2012, 2016 Canonical Ltd
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
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
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
16
17
"""Test the executable bit under various working tree formats."""
18
19
import os
20
2911.5.4 by John Arbash Meinel
Switch around to properly look up the executable bit in the basis.
21
from bzrlib import (
22
    osutils,
23
    )
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
24
from bzrlib.transform import TreeTransform
4523.1.4 by Martin Pool
Rename remaining *_implementations tests
25
from bzrlib.tests.per_workingtree import TestCaseWithWorkingTree
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
26
27
28
class TestExecutable(TestCaseWithWorkingTree):
29
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
30
    def setUp(self):
31
        super(TestExecutable, self).setUp()
32
        self.a_id = "a-20051208024829-849e76f7968d7a86"
33
        self.b_id = "b-20051208024829-849e76f7968d7a86"
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
34
        wt = self.make_branch_and_tree('b1')
35
        b = wt.branch
36
        tt = TreeTransform(wt)
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
37
        tt.new_file('a', tt.root, 'a test\n', self.a_id, True)
38
        tt.new_file('b', tt.root, 'b test\n', self.b_id, False)
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
39
        tt.apply()
40
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
41
        self.wt = wt
42
43
    def check_exist(self, tree):
44
        """Just check that both files have the right executable bits set"""
2255.2.35 by Robert Collins
Remove inappropriate use of inventory in tree executability tests. The inventory is not the authoritative source of executability.
45
        tree.lock_read()
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
46
        self.assertTrue(tree.is_executable(self.a_id),
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
47
                        "'a' lost the execute bit")
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
48
        self.assertFalse(tree.is_executable(self.b_id),
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
49
                    "'b' gained an execute bit")
2255.2.35 by Robert Collins
Remove inappropriate use of inventory in tree executability tests. The inventory is not the authoritative source of executability.
50
        tree.unlock()
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
51
52
    def check_empty(self, tree, ignore_inv=False):
53
        """Check that the files are truly missing
54
        :param ignore_inv: If you just delete files from a working tree
55
                the inventory still shows them, so don't assert that
56
                the inventory is empty, just that the tree doesn't have them
57
        """
2255.2.36 by Robert Collins
Fix Dirstate unversioning of entries which are in a parent.
58
        tree.lock_read()
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
59
        if not ignore_inv:
1852.6.6 by Robert Collins
Finish updating iter_entries change to make all tests pass.
60
            self.assertEqual(
6405.2.10 by Jelmer Vernooij
Fix more tests.
61
                [('', tree.root_inventory.root)],
62
                list(tree.root_inventory.iter_entries()))
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
63
        self.assertFalse(tree.has_id(self.a_id))
64
        self.assertFalse(tree.has_filename('a'))
65
        self.assertFalse(tree.has_id(self.b_id))
66
        self.assertFalse(tree.has_filename('b'))
2255.2.36 by Robert Collins
Fix Dirstate unversioning of entries which are in a parent.
67
        tree.unlock()
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
68
69
    def commit_and_branch(self):
70
        """Commit the current tree, and create a second tree"""
71
        self.wt.commit('adding a,b', rev_id='r1')
72
        # Now make sure that 'bzr branch' also preserves the
73
        # executable bit
6437.70.3 by John Arbash Meinel
Switch from 'clone' to 'sprout' for the executable test.
74
        dir2 = self.wt.branch.bzrdir.sprout('b2', revision_id='r1')
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
75
        wt2 = dir2.open_workingtree()
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
76
        self.assertEqual(['r1'], wt2.get_parent_ids())
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
77
        self.assertEqual('r1', wt2.branch.last_revision())
78
        return wt2
79
80
    def test_01_is_executable(self):
81
        """Make sure that the tree was created and has the executable bit set"""
82
        self.check_exist(self.wt)
83
84
    def test_02_stays_executable(self):
85
        """reopen the tree and ensure it stuck."""
86
        self.wt = self.wt.bzrdir.open_workingtree()
87
        self.check_exist(self.wt)
88
89
    def test_03_after_commit(self):
90
        """Commit the change, and check the history"""
91
        self.wt.commit('adding a,b', rev_id='r1')
92
93
        rev_tree = self.wt.branch.repository.revision_tree('r1')
94
        self.check_exist(rev_tree)
95
96
    def test_04_after_removed(self):
97
        """Make sure reverting removed files brings them back correctly"""
98
        self.wt.commit('adding a,b', rev_id='r1')
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
99
100
        # Make sure the entries are gone
101
        os.remove('b1/a')
102
        os.remove('b1/b')
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
103
        self.check_empty(self.wt, ignore_inv=True)
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
104
105
        # Make sure that revert is able to bring them back,
106
        # and sets 'a' back to being executable
107
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
108
        rev_tree = self.wt.branch.repository.revision_tree('r1')
109
110
        self.wt.revert(['a', 'b'], rev_tree, backups=False)
111
        self.check_exist(self.wt)
112
113
    def test_05_removed_and_committed(self):
114
        """Check that reverting to an earlier commit restores them"""
115
        self.wt.commit('adding a,b', rev_id='r1')
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
116
117
        # Now remove them again, and make sure that after a
118
        # commit, they are still marked correctly
119
        os.remove('b1/a')
120
        os.remove('b1/b')
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
121
        self.wt.commit('removed', rev_id='r2')
122
123
        self.check_empty(self.wt)
124
125
        rev_tree = self.wt.branch.repository.revision_tree('r1')
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
126
        # Now revert back to the previous commit
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
127
        self.wt.revert(old_tree=rev_tree, backups=False)
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
128
129
        self.check_exist(self.wt)
130
131
    def test_06_branch(self):
132
        """branch b1=>b2 should preserve the executable bits"""
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
133
        # TODO: Maybe this should be a blackbox test
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
134
        wt2 = self.commit_and_branch()
135
136
        self.check_exist(wt2)
137
138
    def test_07_pull(self):
139
        """Test that pull will handle bits correctly"""
140
        wt2 = self.commit_and_branch()
141
142
        os.remove('b1/a')
143
        os.remove('b1/b')
144
        self.wt.commit('removed', rev_id='r2')
145
146
        # now wt2 can pull and the files should be removed
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
147
148
        # Make sure pull will delete the files
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
149
        wt2.pull(self.wt.branch)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
150
        self.assertEqual(['r2'], wt2.get_parent_ids())
151
        self.assertEqual('r2', wt2.branch.last_revision())
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
152
        self.check_empty(wt2)
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
153
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
154
        # Now restore the files on the first branch and commit
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
155
        # so that the second branch can pull the changes
156
        # and make sure that the executable bit has been copied
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
157
        rev_tree = self.wt.branch.repository.revision_tree('r1')
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
158
        self.wt.revert(old_tree=rev_tree, backups=False)
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
159
        self.wt.commit('resurrected', rev_id='r3')
160
161
        self.check_exist(self.wt)
162
163
        wt2.pull(self.wt.branch)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
164
        self.assertEqual(['r3'], wt2.get_parent_ids())
165
        self.assertEqual('r3', wt2.branch.last_revision())
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
166
        self.check_exist(wt2)
167
168
    def test_08_no_op_revert(self):
169
        """Just do a simple revert without anything changed
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
170
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
171
        The bits shouldn't swap.
172
        """
173
        self.wt.commit('adding a,b', rev_id='r1')
174
        rev_tree = self.wt.branch.repository.revision_tree('r1')
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
175
        self.wt.revert(old_tree=rev_tree, backups=False)
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
176
        self.check_exist(self.wt)
177
2911.5.4 by John Arbash Meinel
Switch around to properly look up the executable bit in the basis.
178
    def test_commit_with_exec_from_basis(self):
179
        self.wt._is_executable_from_path_and_stat = \
180
            self.wt._is_executable_from_path_and_stat_from_basis
181
        rev_id1 = self.wt.commit('one')
182
        rev_tree1 = self.wt.branch.repository.revision_tree(rev_id1)
6405.2.7 by Jelmer Vernooij
Fix more tests.
183
        a_executable = rev_tree1.root_inventory[self.a_id].executable
184
        b_executable = rev_tree1.root_inventory[self.b_id].executable
2911.5.4 by John Arbash Meinel
Switch around to properly look up the executable bit in the basis.
185
        self.assertIsNot(None, a_executable)
186
        self.assertTrue(a_executable)
187
        self.assertIsNot(None, b_executable)
188
        self.assertFalse(b_executable)
189
190
    def test_use_exec_from_basis(self):
6379.7.3 by Jelmer Vernooij
Fix test_use_exec_from_basis
191
        self.wt._supports_executable = lambda: False
192
        self.addCleanup(self.wt.lock_read().unlock)
193
        self.assertTrue(self.wt.is_executable(self.a_id))
194
        self.assertFalse(self.wt.is_executable(self.b_id))