1
# Copyright (C) 2007, 2009, 2010, 2011 Canonical Ltd
1
# Copyright (C) 2005, 2006 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
111
111
lines = [str(data) for data in stats.data]
112
112
lines = [line for line in lines if 'a_function' in line]
113
113
self.assertLength(1, lines)
115
def test_block_0(self):
116
# When profiler_block is 0, reentrant profile requests fail.
117
self.overrideAttr(bzrlib.lsprof.BzrProfiler, 'profiler_block', 0)
120
profiler = bzrlib.lsprof.BzrProfiler()
121
self.assertRaises(errors.BzrError, profiler.start)
122
inner_calls.append(True)
123
bzrlib.lsprof.profile(inner)
124
self.assertLength(1, inner_calls)
126
def test_block_1(self):
127
# When profiler_block is 1, concurrent profiles serialise.
128
# This is tested by manually acquiring the profiler lock, then
129
# starting a thread that tries to profile, and releasing the lock.
130
# We know due to test_block_0 that two profiles at once hit the lock,
131
# so while this isn't perfect (we'd want a callback on the lock being
132
# entered to allow lockstep evaluation of the actions), its good enough
133
# to be confident regressions would be caught. Alternatively, if this
134
# is flakey, a fake Lock object can be used to trace the calls made.
137
calls.append('profiled')
139
bzrlib.lsprof.profile(profiled)
140
calls.append('after_profiled')
141
thread = threading.Thread(target=do_profile)
142
bzrlib.lsprof.BzrProfiler.profiler_lock.acquire()
147
bzrlib.lsprof.BzrProfiler.profiler_lock.release()
150
self.assertLength(2, calls)