~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
50
    def test_log_screenful(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
51
        """Simulate log --long|less"""
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
52
        self.screenful_tester('long')
53
54
    def test_log_screenful_line(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
55
        """Simulate log --line|less"""
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
56
        self.screenful_tester('line')
57
1756.2.12 by Aaron Bentley
Add screenful benchmark for the short log formatter
58
    def test_log_screenful_short(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
59
        """Simulate log --short|less"""
1756.2.12 by Aaron Bentley
Add screenful benchmark for the short log formatter
60
        self.screenful_tester('short')
61
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
62
    def screenful_tester(self, formatter):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
63
        """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
64
        tree = self.make_many_commit_tree()
65
        def log_screenful():
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
66
            lf = log_formatter(formatter, to_file=LineConsumer(25))
1756.2.9 by Aaron Bentley
Benchmark the time to display a screenful of log
67
            try:
68
                show_log(tree.branch, lf, direction='reverse')
69
            except LinesDone:
70
                pass
71
            else:
72
                raise Exception, "LinesDone not raised"
73
        self.time(log_screenful)
1756.2.14 by Aaron Bentley
Add benchmarks for the log commands
74
75
    def test_cmd_log(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
76
        """Test execution of the log command.""" 
1756.2.14 by Aaron Bentley
Add benchmarks for the log commands
77
        tree = self.make_many_commit_tree()
78
        self.time(self.run_bzr, 'log', '-r', '-4..')
79
80
    def test_cmd_log_subprocess(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
81
        """Text startup and execution of the log command.""" 
1756.2.14 by Aaron Bentley
Add benchmarks for the log commands
82
        tree = self.make_many_commit_tree()
83
        self.time(self.run_bzr_subprocess, 'log', '-r', '-4..')