~bzr-pqm/bzr/bzr.dev

2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2006 Canonical Ltd
1756.1.3 by Aaron Bentley
Add log benchmark
2
#
3
# This program is free software; you can redistribute it and/or modify
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
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.
1756.1.3 by Aaron Bentley
Add log benchmark
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
"""Tests for tree transform performance"""
18
19
import os
20
import sys
21
22
from bzrlib.benchmarks import Benchmark
23
from bzrlib.log import log_formatter, show_log
24
from bzrlib.osutils import pathjoin
1756.2.10 by Aaron Bentley
Use cStringIO to reduce benchmark noise
25
from cStringIO import StringIO
1756.1.3 by Aaron Bentley
Add log benchmark
26
from bzrlib.transform import TreeTransform
27
from bzrlib.workingtree import WorkingTree
28
1756.2.9 by Aaron Bentley
Benchmark the time to display a screenful of log
29
class LinesDone(Exception):
30
    pass
31
32
class LineConsumer(object):
33
34
    def __init__(self, required_lines):
35
        self.required_lines = required_lines
36
37
    def write(self, text):
38
        self.required_lines -= text.count('\n')
39
        if self.required_lines < 0:
40
            raise LinesDone()
41
        
42
1756.1.3 by Aaron Bentley
Add log benchmark
43
class LogBenchmark(Benchmark):
44
45
    def test_log(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
46
        """Run log in a many-commit tree.""" 
1908.2.7 by John Arbash Meinel
Update the benchmarks to actually use the cached trees
47
        tree = self.make_many_commit_tree(hardlink=True)
1756.1.3 by Aaron Bentley
Add log benchmark
48
        lf = log_formatter('long', to_file=StringIO())
49
        self.time(show_log, tree.branch, lf, direction='reverse')
1756.2.9 by Aaron Bentley
Benchmark the time to display a screenful of log
50
1756.2.19 by Aaron Bentley
Add benchmarks for merged trees
51
    def test_merge_log(self):
52
        """Run log in a tree with many merges"""
1908.2.7 by John Arbash Meinel
Update the benchmarks to actually use the cached trees
53
        tree = self.make_heavily_merged_tree(hardlink=True)
1756.2.19 by Aaron Bentley
Add benchmarks for merged trees
54
        lf = log_formatter('short', to_file=StringIO())
55
        self.time(show_log, tree.branch, lf, direction='reverse')
56
1756.2.9 by Aaron Bentley
Benchmark the time to display a screenful of log
57
    def test_log_screenful(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
58
        """Simulate log --long|less"""
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
59
        self.screenful_tester('long')
60
61
    def test_log_screenful_line(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
62
        """Simulate log --line|less"""
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
63
        self.screenful_tester('line')
64
1756.2.12 by Aaron Bentley
Add screenful benchmark for the short log formatter
65
    def test_log_screenful_short(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
66
        """Simulate log --short|less"""
1756.2.12 by Aaron Bentley
Add screenful benchmark for the short log formatter
67
        self.screenful_tester('short')
68
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
69
    def screenful_tester(self, formatter):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
70
        """Run show_log, but stop after 25 lines are generated"""
1908.2.7 by John Arbash Meinel
Update the benchmarks to actually use the cached trees
71
        tree = self.make_many_commit_tree(hardlink=True)
1756.2.9 by Aaron Bentley
Benchmark the time to display a screenful of log
72
        def log_screenful():
1756.2.11 by Aaron Bentley
Add screenful benchmark for the line log formatter
73
            lf = log_formatter(formatter, to_file=LineConsumer(25))
1756.2.9 by Aaron Bentley
Benchmark the time to display a screenful of log
74
            try:
75
                show_log(tree.branch, lf, direction='reverse')
76
            except LinesDone:
77
                pass
78
            else:
79
                raise Exception, "LinesDone not raised"
80
        self.time(log_screenful)
1756.2.14 by Aaron Bentley
Add benchmarks for the log commands
81
82
    def test_cmd_log(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
83
        """Test execution of the log command.""" 
1908.2.7 by John Arbash Meinel
Update the benchmarks to actually use the cached trees
84
        tree = self.make_many_commit_tree(hardlink=True)
1756.2.14 by Aaron Bentley
Add benchmarks for the log commands
85
        self.time(self.run_bzr, 'log', '-r', '-4..')
86
87
    def test_cmd_log_subprocess(self):
1756.2.15 by Aaron Bentley
Fix up benchmark comments
88
        """Text startup and execution of the log command.""" 
1908.2.7 by John Arbash Meinel
Update the benchmarks to actually use the cached trees
89
        tree = self.make_many_commit_tree(hardlink=True)
1756.2.14 by Aaron Bentley
Add benchmarks for the log commands
90
        self.time(self.run_bzr_subprocess, 'log', '-r', '-4..')
1756.3.1 by Aaron Bentley
Add log --verbose benchmark
91
92
    def test_log_verbose(self):
93
        """'verbose' log -- shows file changes"""
1908.2.7 by John Arbash Meinel
Update the benchmarks to actually use the cached trees
94
        tree = self.make_many_commit_tree(hardlink=True)
1756.3.1 by Aaron Bentley
Add log --verbose benchmark
95
        lf = log_formatter('long', to_file=StringIO())
96
        self.time(show_log, tree.branch, lf, direction='reverse', verbose=True)