1
# Copyright (C) 2007-2010 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
"Test suite for the bzr bisect plugin."
19
from __future__ import absolute_import
21
from ..sixish import StringIO
25
from ..controldir import ControlDir
28
TestCaseWithTransport,
33
class BisectTestCase(TestCaseWithTransport):
34
"""Test harness specific to the bisect plugin."""
36
def assertRevno(self, rev):
37
"""Make sure we're at the right revision."""
39
rev_contents = {1: "one", 1.1: "one dot one", 1.2: "one dot two",
40
1.3: "one dot three", 2: "two", 3: "three",
43
with open("test_file") as f:
44
content = f.read().strip()
45
if content != rev_contents[rev]:
46
rev_ids = dict((rev_contents[k], k) for k in rev_contents)
47
found_rev = rev_ids[content]
48
raise AssertionError("expected rev %0.1f, found rev %0.1f"
54
# These tests assume a branch with five revisions, and
55
# a branch from version 1 containing three revisions
56
# merged at version 2.
58
TestCaseWithTransport.setUp(self)
60
self.tree = self.make_branch_and_tree(".")
62
test_file = open("test_file", "w")
63
test_file.write("one")
65
self.tree.add(self.tree.relpath(os.path.join(os.getcwd(),
67
test_file_append = open("test_file_append", "a")
68
test_file_append.write("one\n")
69
test_file_append.close()
70
self.tree.add(self.tree.relpath(os.path.join(os.getcwd(),
72
self.tree.commit(message="add test files")
74
ControlDir.open(".").sprout("../temp-clone")
75
clone_bzrdir = ControlDir.open("../temp-clone")
76
clone_tree = clone_bzrdir.open_workingtree()
77
for content in ["one dot one", "one dot two", "one dot three"]:
78
test_file = open("../temp-clone/test_file", "w")
79
test_file.write(content)
81
test_file_append = open("../temp-clone/test_file_append", "a")
82
test_file_append.write(content + "\n")
83
test_file_append.close()
84
clone_tree.commit(message="make branch test change")
85
saved_subtree_revid = clone_tree.branch.last_revision()
87
self.tree.merge_from_branch(clone_tree.branch)
88
test_file = open("test_file", "w")
89
test_file.write("two")
91
test_file_append = open("test_file_append", "a")
92
test_file_append.write("two\n")
93
test_file_append.close()
94
self.tree.commit(message="merge external branch")
95
shutil.rmtree("../temp-clone")
97
self.subtree_rev = saved_subtree_revid
99
file_contents = ["three", "four", "five"]
100
for content in file_contents:
101
test_file = open("test_file", "w")
102
test_file.write(content)
104
test_file_append = open("test_file_append", "a")
105
test_file_append.write(content + "\n")
106
test_file_append.close()
107
self.tree.commit(message="make test change")
110
class BisectHarnessTests(BisectTestCase):
111
"""Tests for the harness itself."""
113
def testLastRev(self):
114
"""Test that the last revision is correct."""
115
repo = self.tree.branch.repository
116
top_revtree = repo.revision_tree(self.tree.last_revision())
117
top_revtree.lock_read()
118
top_file = top_revtree.get_file("test_file")
119
test_content = top_file.read().strip()
122
self.assertEqual(test_content, b"five")
124
def testSubtreeRev(self):
125
"""Test that the last revision in a subtree is correct."""
126
repo = self.tree.branch.repository
127
sub_revtree = repo.revision_tree(self.subtree_rev)
128
sub_revtree.lock_read()
129
with sub_revtree.get_file("test_file") as sub_file:
130
test_content = sub_file.read().strip()
132
self.assertEqual(test_content, b"one dot three")
135
class BisectCurrentUnitTests(BisectTestCase):
136
"""Test the BisectCurrent class."""
138
def testShowLog(self):
139
"""Test that the log can be shown."""
140
# Not a very good test; just makes sure the code doesn't fail,
141
# not that the output makes any sense.
143
bisect.BisectCurrent(self.tree.controldir).show_rev_log(outf=sio)
145
def testShowLogSubtree(self):
146
"""Test that a subtree's log can be shown."""
147
current = bisect.BisectCurrent(self.tree.controldir)
148
current.switch(self.subtree_rev)
150
current.show_rev_log(outf=sio)
152
def testSwitchVersions(self):
153
"""Test switching versions."""
154
current = bisect.BisectCurrent(self.tree.controldir)
160
"""Test resetting the working tree to a non-bisected state."""
161
current = bisect.BisectCurrent(self.tree.controldir)
165
self.assertFalse(os.path.exists(
166
os.path.join('.bzr', bisect.BISECT_REV_PATH)))
168
def testIsMergePoint(self):
169
"""Test merge point detection."""
170
current = bisect.BisectCurrent(self.tree.controldir)
172
self.assertFalse(current.is_merge_point())
174
self.assertTrue(current.is_merge_point())
177
class BisectLogUnitTests(BisectTestCase):
178
"""Test the BisectLog class."""
180
def testCreateBlank(self):
181
"""Test creation of new log."""
182
bisect_log = bisect.BisectLog(self.tree.controldir)
185
os.path.exists(os.path.join('.bzr', bisect.BISECT_INFO_PATH)))
188
"""Test loading a log."""
189
preloaded_log = open(os.path.join(
190
'.bzr', bisect.BISECT_INFO_PATH), "w")
191
preloaded_log.write("rev1 yes\nrev2 no\nrev3 yes\n")
192
preloaded_log.close()
194
bisect_log = bisect.BisectLog(self.tree.controldir)
195
self.assertEqual(len(bisect_log._items), 3)
196
self.assertEqual(bisect_log._items[0], (b"rev1", "yes"))
197
self.assertEqual(bisect_log._items[1], (b"rev2", "no"))
198
self.assertEqual(bisect_log._items[2], (b"rev3", "yes"))
201
"""Test saving the log."""
202
bisect_log = bisect.BisectLog(self.tree.controldir)
203
bisect_log._items = [
204
(b"rev1", "yes"), (b"rev2", "no"), (b"rev3", "yes")]
207
with open(os.path.join('.bzr', bisect.BISECT_INFO_PATH), 'rb') as logfile:
208
self.assertEqual(logfile.read(), b"rev1 yes\nrev2 no\nrev3 yes\n")