~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/benchmarks/__init__.py

  • Committer: Martin Pool
  • Date: 2005-05-03 08:00:27 UTC
  • Revision ID: mbp@sourcefrog.net-20050503080027-908edb5b39982198
doc

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 by 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
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
 
 
17
 
 
18
 
"""Benchmark test suite for bzr."""
19
 
 
20
 
from bzrlib import bzrdir, plugin
21
 
from bzrlib.tests.TestUtil import TestLoader
22
 
from bzrlib.tests.blackbox import ExternalBase
23
 
 
24
 
 
25
 
class Benchmark(ExternalBase):
26
 
 
27
 
    def make_kernel_like_tree(self, url=None):
28
 
        """Setup a temporary tree roughly like a kernel tree.
29
 
        
30
 
        :param url: Creat the kernel like tree as a lightweight checkout
31
 
        of a new branch created at url.
32
 
        """
33
 
        # a kernel tree has ~10000 and 500 directory, with most files around 
34
 
        # 3-4 levels deep. 
35
 
        # we simulate this by three levels of dirs named 0-7, givin 512 dirs,
36
 
        # and 20 files each.
37
 
        if url is not None:
38
 
            b = bzrdir.BzrDir.create_branch_convenience(url)
39
 
            d = bzrdir.BzrDir.create('.')
40
 
            bzrlib.branch.BranchReferenceFormat().initialize(d, b)
41
 
            d.create_workingtree()
42
 
        else:
43
 
            self.run_bzr('init')
44
 
        files = []
45
 
        for outer in range(8):
46
 
            files.append("%s/" % outer)
47
 
            for middle in range(8):
48
 
                files.append("%s/%s/" % (outer, middle))
49
 
                for inner in range(8):
50
 
                    prefix = "%s/%s/%s/" % (outer, middle, inner)
51
 
                    files.append(prefix)
52
 
                    files.extend([prefix + str(foo) for foo in range(20)])
53
 
        self.build_tree(files)
54
 
 
55
 
    def make_many_commit_tree(self, directory_name='.'):
56
 
        """Create a tree with many commits.
57
 
        
58
 
        No files change are included.
59
 
        """
60
 
        tree = bzrdir.BzrDir.create_standalone_workingtree(directory_name)
61
 
        tree.lock_write()
62
 
        tree.branch.lock_write()
63
 
        tree.branch.repository.lock_write()
64
 
        try:
65
 
            for i in xrange(1000):
66
 
                tree.commit('no-changes commit %d' % i)
67
 
        finally:
68
 
            try:
69
 
                try:
70
 
                    tree.branch.repository.unlock()
71
 
                finally:
72
 
                    tree.branch.unlock()
73
 
            finally:
74
 
                tree.unlock()
75
 
        return tree
76
 
 
77
 
    def make_heavily_merged_tree(self, directory_name='.'):
78
 
        """Create a tree in which almost every commit is a merge.
79
 
       
80
 
        No files change are included.  This produces two trees, 
81
 
        one of which is returned.  Except for the first commit, every
82
 
        commit in its revision-history is a merge another commit in the other
83
 
        tree.
84
 
        """
85
 
        tree = bzrdir.BzrDir.create_standalone_workingtree(directory_name)
86
 
        tree.lock_write()
87
 
        try:
88
 
            tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
89
 
            tree2.lock_write()
90
 
            try:
91
 
                for i in xrange(250):
92
 
                    revision_id = tree.commit('no-changes commit %d-a' % i)
93
 
                    tree2.branch.fetch(tree.branch, revision_id)
94
 
                    tree2.set_pending_merges([revision_id])
95
 
                    revision_id = tree2.commit('no-changes commit %d-b' % i)
96
 
                    tree.branch.fetch(tree2.branch, revision_id)
97
 
                    tree.set_pending_merges([revision_id])
98
 
                tree.set_pending_merges([])
99
 
            finally:
100
 
                tree.unlock()
101
 
        finally:
102
 
            tree2.unlock()
103
 
        return tree
104
 
 
105
 
 
106
 
def test_suite():
107
 
    """Build and return a TestSuite which contains benchmark tests only."""
108
 
    testmod_names = [ \
109
 
                   'bzrlib.benchmarks.bench_add',
110
 
                   'bzrlib.benchmarks.bench_bench',
111
 
                   'bzrlib.benchmarks.bench_checkout',
112
 
                   'bzrlib.benchmarks.bench_commit',
113
 
                   'bzrlib.benchmarks.bench_inventory',
114
 
                   'bzrlib.benchmarks.bench_log',
115
 
                   'bzrlib.benchmarks.bench_osutils',
116
 
                   'bzrlib.benchmarks.bench_rocks',
117
 
                   'bzrlib.benchmarks.bench_status',
118
 
                   'bzrlib.benchmarks.bench_transform',
119
 
                   'bzrlib.benchmarks.bench_workingtree',
120
 
                   ]
121
 
    suite = TestLoader().loadTestsFromModuleNames(testmod_names) 
122
 
 
123
 
    # Load any benchmarks from plugins
124
 
    for name, module in plugin.all_plugins().items():
125
 
        if getattr(module, 'bench_suite', None) is not None:
126
 
            suite.addTest(module.bench_suite())
127
 
 
128
 
    return suite