~bzr-pqm/bzr/bzr.dev

1756.1.3 by Aaron Bentley
Add log benchmark
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 version 2 as published by
5
# the Free Software Foundation.
6
#
7
# This program is distributed in the hope that it will be useful,
8
# but WITHOUT ANY WARRANTY; without even the implied warranty of
9
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
# GNU General Public License for more details.
11
#
12
# You should have received a copy of the GNU General Public License
13
# along with this program; if not, write to the Free Software
14
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15
16
"""Tests for tree transform performance"""
17
18
import os
19
import sys
20
21
from bzrlib.benchmarks import Benchmark
22
from bzrlib.log import log_formatter, show_log
23
from bzrlib.osutils import pathjoin
1756.2.10 by Aaron Bentley
Use cStringIO to reduce benchmark noise
24
from cStringIO import StringIO
1756.1.3 by Aaron Bentley
Add log benchmark
25
from bzrlib.transform import TreeTransform
26
from bzrlib.workingtree import WorkingTree
27
1756.2.9 by Aaron Bentley
Benchmark the time to display a screenful of log
28
class LinesDone(Exception):
29
    pass
30
31
class LineConsumer(object):
32
33
    def __init__(self, required_lines):
34
        self.required_lines = required_lines
35
36
    def write(self, text):
37
        self.required_lines -= text.count('\n')
38
        if self.required_lines < 0:
39
            raise LinesDone()
40
        
41
1756.1.3 by Aaron Bentley
Add log benchmark
42
class LogBenchmark(Benchmark):
43
44
    def test_log(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
45
        """Run log in a many-commit tree.""" 
1756.1.3 by Aaron Bentley
Add log benchmark
46
        tree = self.make_many_commit_tree()
47
        lf = log_formatter('long', to_file=StringIO())
48
        self.time(show_log, tree.branch, lf, direction='reverse')
1756.2.9 by Aaron Bentley
Benchmark the time to display a screenful of log
49
1756.2.19 by Aaron Bentley
Add benchmarks for merged trees
50
    def test_merge_log(self):
51
        """Run log in a tree with many merges"""
52
        tree = self.make_heavily_merged_tree()
53
        lf = log_formatter('short', to_file=StringIO())
54
        self.time(show_log, tree.branch, lf, direction='reverse')
55
1756.2.9 by Aaron Bentley
Benchmark the time to display a screenful of log
56
    def test_log_screenful(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
57
        """Simulate log --long|less"""
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
58
        self.screenful_tester('long')
59
60
    def test_log_screenful_line(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
61
        """Simulate log --line|less"""
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
62
        self.screenful_tester('line')
63
1756.2.12 by Aaron Bentley
Add screenful benchmark for the short log formatter
64
    def test_log_screenful_short(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
65
        """Simulate log --short|less"""
1756.2.12 by Aaron Bentley
Add screenful benchmark for the short log formatter
66
        self.screenful_tester('short')
67
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
68
    def screenful_tester(self, formatter):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
69
        """Run show_log, but stop after 25 lines are generated"""
1756.2.9 by Aaron Bentley
Benchmark the time to display a screenful of log
70
        tree = self.make_many_commit_tree()
71
        def log_screenful():
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
72
            lf = log_formatter(formatter, to_file=LineConsumer(25))
1756.2.9 by Aaron Bentley
Benchmark the time to display a screenful of log
73
            try:
74
                show_log(tree.branch, lf, direction='reverse')
75
            except LinesDone:
76
                pass
77
            else:
78
                raise Exception, "LinesDone not raised"
79
        self.time(log_screenful)
1756.2.14 by Aaron Bentley
Add benchmarks for the log commands
80
81
    def test_cmd_log(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
82
        """Test execution of the log command.""" 
1756.2.14 by Aaron Bentley
Add benchmarks for the log commands
83
        tree = self.make_many_commit_tree()
84
        self.time(self.run_bzr, 'log', '-r', '-4..')
85
86
    def test_cmd_log_subprocess(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
87
        """Text startup and execution of the log command.""" 
1756.2.14 by Aaron Bentley
Add benchmarks for the log commands
88
        tree = self.make_many_commit_tree()
89
        self.time(self.run_bzr_subprocess, 'log', '-r', '-4..')
1756.3.1 by Aaron Bentley
Add log --verbose benchmark
90
91
    def test_log_verbose(self):
92
        """'verbose' log -- shows file changes"""
93
        tree = self.make_many_commit_tree()
94
        lf = log_formatter('long', to_file=StringIO())
95
        self.time(show_log, tree.branch, lf, direction='reverse', verbose=True)