19
19
from bzrlib import (
22
from bzrlib import plugin as _mod_plugin
23
23
import bzrlib.branch
24
24
from bzrlib.tests.TestUtil import TestLoader
25
25
from bzrlib.tests.blackbox import ExternalBase
28
28
class Benchmark(ExternalBase):
29
"""A Test class which provides helpers for writing benchmark tests."""
30
31
def make_kernel_like_tree(self, url=None, root='.',
31
32
link_working=False):
32
33
"""Setup a temporary tree roughly like a kernel tree.
34
35
:param url: Creat the kernel like tree as a lightweight checkout
35
of a new branch created at url.
36
of a new branch created at url.
37
:param root: Path where the tree will be created.
36
38
:param link_working: instead of creating a new copy of all files
37
39
just hardlink the working tree. Tests must request this, because
38
40
they must break links if they want to change the files
41
:return: A newly created tree.
40
43
from bzrlib.benchmarks.tree_creator.kernel_like import (
41
44
KernelLikeTreeCreator,
74
77
:param link_working: Instead of copying all of the working tree
75
78
files, just hardlink them to the cached files. Tests can unlink
76
79
files that they will change.
77
:param link_bzr: Hardlink the .bzr directory. For readonly
80
:param link_bzr: Hardlink the .bzr directory. For readonly
78
81
operations this is safe, and shaves off a lot of setup time
80
83
from bzrlib.benchmarks.tree_creator.kernel_like import (
101
104
def make_many_commit_tree(self, directory_name='.',
103
106
"""Create a tree with many commits.
105
No file changes are included. Not hardlinking the working tree,
108
No file changes are included. Not hardlinking the working tree,
106
109
because there are no working tree files.
108
111
from bzrlib.benchmarks.tree_creator.simple_many_commit import (
114
117
def make_heavily_merged_tree(self, directory_name='.',
116
119
"""Create a tree in which almost every commit is a merge.
118
No file changes are included. This produces two trees,
121
No file changes are included. This produces two trees,
119
122
one of which is returned. Except for the first commit, every
120
123
commit in its revision-history is a merge another commit in the other
121
tree. Not hardlinking the working tree, because there are no working
124
tree. Not hardlinking the working tree, because there are no working
124
127
from bzrlib.benchmarks.tree_creator.heavily_merged import (
127
130
creator = HeavilyMergedTreeCreator(self, link_bzr=hardlink)
128
131
return creator.create(root=directory_name)
130
def create_with_commits(self, num_files, num_commits, directory_name='.'):
133
def create_with_commits(self, num_files, num_commits, directory_name='.',
131
135
"""Create a tree with many files and many commits. Every commit changes
132
136
exactly one file.
134
138
:param num_files: number of files to be created
135
139
:param num_commits: number of commits in the newly created tree
137
files = ["%s/%s" % (directory_name, i) for i in range(num_files)]
141
f.write("some content\n")
144
tree = bzrdir.BzrDir.create_standalone_workingtree(directory_name)
145
tree.add([str(i) for i in range(num_files)])
148
tree.commit('initial commit')
149
for i in range(num_commits):
150
fn = files[i % len(files)]
151
content = range(i) + [i, i, i, ""]
154
f.write("\n".join([str(i) for i in content]))
157
tree.commit("changing file %s" % fn)
141
from bzrlib.benchmarks.tree_creator.many_commit import (
142
ManyCommitTreeCreator,
144
creator = ManyCommitTreeCreator(self, link_bzr=hardlink,
146
num_commits=num_commits)
147
tree = creator.create(root=directory_name)
148
files = ["%s/%s" % (directory_name, fn) for fn in creator.files]
160
149
return tree, files
162
151
def commit_some_revisions(self, tree, files, num_commits,
167
156
:param tree: The tree in which the changes happen.
168
157
:param files: The list of files where changes should occur.
169
158
:param num_commits: The number of commits
170
:param changes_per_commit: The number of files that are touched in
159
:param changes_per_commit: The number of files that are touched in
173
162
for j in range(num_commits):
174
163
for i in range(changes_per_commit):
187
176
testmod_names = [ \
188
177
'bzrlib.benchmarks.bench_add',
189
178
'bzrlib.benchmarks.bench_bench',
179
'bzrlib.benchmarks.bench_bundle',
190
180
'bzrlib.benchmarks.bench_cache_utf8',
191
181
'bzrlib.benchmarks.bench_checkout',
192
182
'bzrlib.benchmarks.bench_commit',
183
'bzrlib.benchmarks.bench_dirstate',
184
'bzrlib.benchmarks.bench_info',
193
185
'bzrlib.benchmarks.bench_inventory',
186
'bzrlib.benchmarks.bench_knit',
194
187
'bzrlib.benchmarks.bench_log',
188
'bzrlib.benchmarks.bench_pack',
195
189
'bzrlib.benchmarks.bench_osutils',
196
190
'bzrlib.benchmarks.bench_rocks',
191
'bzrlib.benchmarks.bench_startup',
197
192
'bzrlib.benchmarks.bench_status',
198
193
'bzrlib.benchmarks.bench_transform',
199
194
'bzrlib.benchmarks.bench_workingtree',
200
195
'bzrlib.benchmarks.bench_sftp',
201
196
'bzrlib.benchmarks.bench_xml',
203
suite = TestLoader().loadTestsFromModuleNames(testmod_names)
198
suite = TestLoader().loadTestsFromModuleNames(testmod_names)
205
200
# Load any benchmarks from plugins
206
for name, module in plugin.all_plugins().items():
207
if getattr(module, 'bench_suite', None) is not None:
208
suite.addTest(module.bench_suite())
201
for name, plugin in _mod_plugin.plugins().items():
202
if getattr(plugin.module, 'bench_suite', None) is not None:
203
suite.addTest(plugin.module.bench_suite())