/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5557.1.15 by John Arbash Meinel
Merge bzr.dev 5597 to resolve NEWS, aka bzr-2.3.txt
1
# Copyright (C) 2007, 2009, 2010, 2011 Canonical Ltd
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
16
17
"""Tests for profiling data collection."""
18
19
6621.2.26 by Martin
Misc set of changes to get started with selftest on Python 3
20
try:
21
    import cPickle as pickle
22
except ImportError:
23
    import pickle
5331.1.1 by Robert Collins
``bzrlib.lsprof.profile`` will no longer silently generate bad threaded
24
import threading
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
25
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
26
import breezy
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
27
from .. import errors, tests
28
from . import (
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
29
    features,
30
    )
1551.15.28 by Aaron Bentley
Improve Feature usage style w/ lsprof
31
32
2493.2.5 by Ian Clatworthy
explicit format saving test
33
_TXT_HEADER = "   CallCount    Recursive    Total(ms)   " + \
34
    "Inline(ms) module:lineno(function)\n"
35
36
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
37
def _junk_callable():
38
    "A simple routine to profile."
39
    result = sorted(['abc', 'def', 'ghi'])
40
41
42
def _collect_stats():
43
    "Collect and return some dummy profile data."
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
44
    from breezy.lsprof import profile
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
45
    ret, stats = profile(_junk_callable)
46
    return stats
47
48
2493.2.6 by Aaron Bentley
Make LSProf into a Feature required by the appropriate tests
49
class TestStatsSave(tests.TestCaseInTempDir):
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
50
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
51
    _test_needs_features = [features.lsprof_feature]
1551.15.28 by Aaron Bentley
Improve Feature usage style w/ lsprof
52
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
53
    def setUp(self):
2493.2.6 by Aaron Bentley
Make LSProf into a Feature required by the appropriate tests
54
        super(tests.TestCaseInTempDir, self).setUp()
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
55
        self.stats = _collect_stats()
56
57
    def _tempfile(self, ext):
58
        dir = self.test_dir
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
59
        return breezy.osutils.pathjoin(dir, "tmp_profile_data." + ext)
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
60
61
    def test_stats_save_to_txt(self):
62
        f = self._tempfile("txt")
63
        self.stats.save(f)
64
        lines = open(f).readlines()
2493.2.5 by Ian Clatworthy
explicit format saving test
65
        self.assertEqual(lines[0], _TXT_HEADER)
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
66
67
    def test_stats_save_to_callgrind(self):
68
        f = self._tempfile("callgrind")
69
        self.stats.save(f)
70
        lines = open(f).readlines()
2493.2.5 by Ian Clatworthy
explicit format saving test
71
        self.assertEqual(lines[0], "events: Ticks\n")
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
72
        f = breezy.osutils.pathjoin(self.test_dir, "callgrind.out.foo")
2805.7.2 by Ian Clatworthy
use basename, not full path, when checking for callgrind.out file prefix
73
        self.stats.save(f)
74
        lines = open(f).readlines()
75
        self.assertEqual(lines[0], "events: Ticks\n")
2493.2.5 by Ian Clatworthy
explicit format saving test
76
        # Test explicit format nommination
77
        f2 = self._tempfile("txt")
78
        self.stats.save(f2, format="callgrind")
79
        lines2 = open(f2).readlines()
80
        self.assertEqual(lines2[0], "events: Ticks\n")
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
81
82
    def test_stats_save_to_pickle(self):
83
        f = self._tempfile("pkl")
84
        self.stats.save(f)
6621.2.26 by Martin
Misc set of changes to get started with selftest on Python 3
85
        data1 = pickle.load(open(f))
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
86
        self.assertEqual(type(data1), breezy.lsprof.Stats)
4641.3.2 by Robert Collins
lsprof support.
87
88
89
class TestBzrProfiler(tests.TestCase):
90
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
91
    _test_needs_features = [features.lsprof_feature]
4641.3.2 by Robert Collins
lsprof support.
92
93
    def test_start_call_stuff_stop(self):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
94
        profiler = breezy.lsprof.BzrProfiler()
4641.3.2 by Robert Collins
lsprof support.
95
        profiler.start()
96
        try:
97
            def a_function():
98
                pass
99
            a_function()
100
        finally:
101
            stats = profiler.stop()
102
        stats.freeze()
103
        lines = [str(data) for data in stats.data]
104
        lines = [line for line in lines if 'a_function' in line]
105
        self.assertLength(1, lines)
5331.1.1 by Robert Collins
``bzrlib.lsprof.profile`` will no longer silently generate bad threaded
106
107
    def test_block_0(self):
108
        # When profiler_block is 0, reentrant profile requests fail.
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
109
        self.overrideAttr(breezy.lsprof.BzrProfiler, 'profiler_block', 0)
5331.1.1 by Robert Collins
``bzrlib.lsprof.profile`` will no longer silently generate bad threaded
110
        inner_calls = []
111
        def inner():
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
112
            profiler = breezy.lsprof.BzrProfiler()
5331.1.1 by Robert Collins
``bzrlib.lsprof.profile`` will no longer silently generate bad threaded
113
            self.assertRaises(errors.BzrError, profiler.start)
114
            inner_calls.append(True)
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
115
        breezy.lsprof.profile(inner)
5331.1.1 by Robert Collins
``bzrlib.lsprof.profile`` will no longer silently generate bad threaded
116
        self.assertLength(1, inner_calls)
117
118
    def test_block_1(self):
119
        # When profiler_block is 1, concurrent profiles serialise.
120
        # This is tested by manually acquiring the profiler lock, then
121
        # starting a thread that tries to profile, and releasing the lock. 
122
        # We know due to test_block_0 that two profiles at once hit the lock,
123
        # so while this isn't perfect (we'd want a callback on the lock being
124
        # entered to allow lockstep evaluation of the actions), its good enough
125
        # to be confident regressions would be caught. Alternatively, if this
126
        # is flakey, a fake Lock object can be used to trace the calls made.
127
        calls = []
128
        def profiled():
129
            calls.append('profiled')
130
        def do_profile():
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
131
            breezy.lsprof.profile(profiled)
5331.1.1 by Robert Collins
``bzrlib.lsprof.profile`` will no longer silently generate bad threaded
132
            calls.append('after_profiled')
133
        thread = threading.Thread(target=do_profile)
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
134
        breezy.lsprof.BzrProfiler.profiler_lock.acquire()
5331.1.1 by Robert Collins
``bzrlib.lsprof.profile`` will no longer silently generate bad threaded
135
        try:
136
            try:
137
                thread.start()
138
            finally:
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
139
                breezy.lsprof.BzrProfiler.profiler_lock.release()
5331.1.1 by Robert Collins
``bzrlib.lsprof.profile`` will no longer silently generate bad threaded
140
        finally:
141
            thread.join()
142
        self.assertLength(2, calls)