~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/matchers.py

  • Committer: Martin Packman
  • Date: 2012-01-05 09:50:04 UTC
  • mfrom: (6424 +trunk)
  • mto: This revision was merged to the branch mainline in revision 6426.
  • Revision ID: martin.packman@canonical.com-20120105095004-mia9xb7y0efmto0v
Merge bzr.dev to resolve conflicts in bzrlib.builtins

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
__all__ = [
30
30
    'HasLayout',
31
31
    'MatchesAncestry',
 
32
    'ContainsNoVfsCalls',
32
33
    'ReturnsUnlockable',
33
34
    ]
34
35
 
35
36
from bzrlib import (
 
37
    osutils,
36
38
    revision as _mod_revision,
37
39
    )
 
40
from bzrlib import lazy_import
 
41
lazy_import.lazy_import(globals(),
 
42
"""
 
43
from bzrlib.smart.request import request_handlers as smart_request_handlers
 
44
from bzrlib.smart import vfs
 
45
""")
38
46
 
39
47
from testtools.matchers import Equals, Mismatch, Matcher
40
48
 
54
62
        self.lockable_thing = lockable_thing
55
63
 
56
64
    def __str__(self):
57
 
        return ('ReturnsUnlockable(lockable_thing=%s)' % 
 
65
        return ('ReturnsUnlockable(lockable_thing=%s)' %
58
66
            self.lockable_thing)
59
67
 
60
68
    def match(self, lock_method):
131
139
        """Get the (path, file_id) pairs for the current tree."""
132
140
        tree.lock_read()
133
141
        try:
134
 
            return [(path, ie.file_id) for path, ie
135
 
                    in tree.iter_entries_by_dir()]
 
142
            for path, ie in tree.iter_entries_by_dir():
 
143
                if ie.parent_id is None:
 
144
                    yield (u"", ie.file_id)
 
145
                else:
 
146
                    yield (path+ie.kind_character(), ie.file_id)
136
147
        finally:
137
148
            tree.unlock()
138
149
 
 
150
    @staticmethod
 
151
    def _strip_unreferenced_directories(entries):
 
152
        """Strip all directories that don't (in)directly contain any files.
 
153
 
 
154
        :param entries: List of path strings or (path, ie) tuples to process
 
155
        """
 
156
        directories = []
 
157
        for entry in entries:
 
158
            if isinstance(entry, basestring):
 
159
                path = entry
 
160
            else:
 
161
                path = entry[0]
 
162
            if not path or path[-1] == "/":
 
163
                # directory
 
164
                directories.append((path, entry))
 
165
            else:
 
166
                # Yield the referenced parent directories
 
167
                for dirpath, direntry in directories:
 
168
                    if osutils.is_inside(dirpath, path):
 
169
                        yield direntry
 
170
                directories = []
 
171
                yield entry
 
172
 
139
173
    def __str__(self):
140
 
        return ('HasLayout(%r)' % self.entries)
 
174
        return 'HasLayout(%r)' % self.entries
141
175
 
142
176
    def match(self, tree):
143
 
        actual = self.get_tree_layout(tree)
 
177
        actual = list(self.get_tree_layout(tree))
144
178
        if self.entries and isinstance(self.entries[0], basestring):
145
179
            actual = [path for (path, fileid) in actual]
146
 
        return Equals(actual).match(self.entries)
 
180
        if not tree.has_versioned_directories():
 
181
            entries = list(self._strip_unreferenced_directories(self.entries))
 
182
        else:
 
183
            entries = self.entries
 
184
        return Equals(entries).match(actual)
 
185
 
 
186
 
 
187
class _NoVfsCallsMismatch(Mismatch):
 
188
    """Mismatch describing a list of HPSS calls which includes VFS requests."""
 
189
 
 
190
    def __init__(self, vfs_calls):
 
191
        self.vfs_calls = vfs_calls
 
192
 
 
193
    def describe(self):
 
194
        return "no VFS calls expected, got: %s" % ",".join([
 
195
            "%s(%s)" % (c.method,
 
196
                ", ".join([repr(a) for a in c.args])) for c in self.vfs_calls])
 
197
 
 
198
 
 
199
class ContainsNoVfsCalls(Matcher):
 
200
    """Ensure that none of the specified calls are HPSS calls."""
 
201
 
 
202
    def __str__(self):
 
203
        return 'ContainsNoVfsCalls()'
 
204
 
 
205
    @classmethod
 
206
    def match(cls, hpss_calls):
 
207
        vfs_calls = []
 
208
        for call in hpss_calls:
 
209
            try:
 
210
                request_method = smart_request_handlers.get(call.call.method)
 
211
            except KeyError:
 
212
                # A method we don't know about doesn't count as a VFS method.
 
213
                continue
 
214
            if issubclass(request_method, vfs.VfsRequest):
 
215
                vfs_calls.append(call.call)
 
216
        if len(vfs_calls) == 0:
 
217
            return None
 
218
        return _NoVfsCallsMismatch(vfs_calls)