/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_strace.py

Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.

This is used to replace various ad hoc implementations of the same logic,
notably the version used in registry's _LazyObjectGetter which had a bug when
getting a module without also getting a member.  And of course, this new
function has unit tests, unlike the replaced code.

This also adds a KnownHooksRegistry subclass to provide a more natural home for
some other logic.

I'm not thrilled about the name of the new module or the new functions, but it's
hard to think of good names for such generic functionality.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007 Canonical Ltd
2
 
#   Authors: Robert Collins <robert.collins@canonical.com>
 
1
# Copyright (C) 2007, 2010 Canonical Ltd
3
2
#
4
3
# This program is free software; you can redistribute it and/or modify
5
4
# it under the terms of the GNU General Public License as published by
22
21
import threading
23
22
 
24
23
from bzrlib import (
 
24
    strace,
25
25
    tests,
26
26
    )
27
27
from bzrlib.strace import StraceFeature, strace_detailed, StraceResult
28
28
 
29
29
 
30
 
class TestStraceFeature(tests.TestCaseWithTransport):
31
 
 
32
 
    def test_strace_detection(self):
33
 
        """Strace is available if its runnable."""
34
 
        try:
35
 
            proc = subprocess.Popen(['strace'],
36
 
                stderr=subprocess.PIPE,
37
 
                stdout=subprocess.PIPE)
38
 
            proc.communicate()
39
 
            found_strace = True
40
 
        except OSError, e:
41
 
            if e.errno == errno.ENOENT:
42
 
                # strace is not installed
43
 
                found_strace = False
44
 
            else:
45
 
                raise
46
 
        self.assertEqual(found_strace, StraceFeature.available())
47
 
 
48
 
 
49
30
class TestStrace(tests.TestCaseWithTransport):
50
31
 
51
32
    _test_needs_features = [StraceFeature]
52
33
 
 
34
    def setUp(self):
 
35
        # NB: see http://pad.lv/626679 and
 
36
        # <https://code.launchpad.net/~mbp/bzr/626679-strace/+merge/34157>:
 
37
        # testing strace by connecting to ourselves has repeatedly caused
 
38
        # hangs in running the test suite; these are fixable given enough
 
39
        # determination but given that strace is not used by any other tests
 
40
        # at the moment and that it's only test-support code, we just leave it
 
41
        # untested -- mbp 20100901
 
42
        raise tests.TestSkipped("strace selftests are broken and disabled")
 
43
 
53
44
    def _check_threads(self):
54
45
        # For bug #226769, it was decided that the strace tests should not be
55
46
        # run when more than one thread is active. A lot of tests are currently
61
52
            raise tests.KnownFailure(
62
53
                '%d active threads, bug #103133 needs to be fixed.' % active)
63
54
 
 
55
    def strace_detailed_or_skip(self, *args, **kwargs):
 
56
        """Run strace, but cope if it's not allowed"""
 
57
        try:
 
58
            return strace_detailed(*args, **kwargs)
 
59
        except strace.StraceError, e:
 
60
            if e.err_messages.startswith(
 
61
                    "attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted"):
 
62
                raise tests.TestSkipped("ptrace not permitted")
 
63
            else:
 
64
                raise
 
65
 
64
66
    def test_strace_callable_is_called(self):
65
67
        self._check_threads()
66
68
 
67
69
        output = []
68
70
        def function(positional, *args, **kwargs):
69
71
            output.append((positional, args, kwargs))
70
 
        strace_detailed(function, ["a", "b"], {"c": "c"},
71
 
                        follow_children=False)
 
72
        self.strace_detailed_or_skip(
 
73
            function, ["a", "b"], {"c": "c"},
 
74
            follow_children=False)
72
75
        self.assertEqual([("a", ("b",), {"c":"c"})], output)
73
76
 
74
77
    def test_strace_callable_result(self):
76
79
 
77
80
        def function():
78
81
            return "foo"
79
 
        result, strace_result = strace_detailed(function,[], {},
 
82
        result, strace_result = self.strace_detailed_or_skip(function,[], {},
80
83
                                                follow_children=False)
81
84
        self.assertEqual("foo", result)
82
85
        self.assertIsInstance(strace_result, StraceResult)
87
90
 
88
91
        def function():
89
92
            self.build_tree(['myfile'])
90
 
        unused, result = strace_detailed(function, [], {},
 
93
        unused, result = self.strace_detailed_or_skip(function, [], {},
91
94
                                         follow_children=False)
92
95
        self.assertContainsRe(result.raw_log, 'myfile')