~launchpad-pqm/launchpad/devel

8687.15.17 by Karl Fogel
Add the copyright header block to the rest of the files under lib/lp/.
1
# Copyright 2009 Canonical Ltd.  This software is licensed under the
2
# GNU Affero General Public License version 3 (see the file LICENSE).
3
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
4
"""Tests for lp.registry.scripts.productreleasefinder.hose."""
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
5
3691.131.4 by James Henstridge
add support for limiting which subdirs get walked in Hose
6
import os
7
import shutil
8
import tempfile
3691.84.3 by James Henstridge
fix canonical.dyson.hose + tests to work with FilterPattern
9
import unittest
3691.131.4 by James Henstridge
add support for limiting which subdirs get walked in Hose
10
11
from canonical.testing import reset_logging
8426.6.1 by Michael Hudson
bzr ls --versioned --recursive --kind=file | xargs sed -i -e 's,from canonical.codehosting,from lp.codehosting,'
12
from lp.codehosting.codeimport.tests.helpers import (
11403.1.4 by Henning Eggers
Reformatted imports using format-imports script r32.
13
    instrument_method,
14
    InstrumentedMethodObserver,
15
    )
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
16
17
3691.84.3 by James Henstridge
fix canonical.dyson.hose + tests to work with FilterPattern
18
class Hose_Logging(unittest.TestCase):
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
19
    def testCreatesDefaultLogger(self):
20
        """Hose creates a default logger."""
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
21
        from lp.registry.scripts.productreleasefinder.hose import Hose
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
22
        from logging import Logger
23
        h = Hose()
24
        self.failUnless(isinstance(h.log, Logger))
25
26
    def testCreatesChildLogger(self):
27
        """Hose creates a child logger if given a parent."""
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
28
        from lp.registry.scripts.productreleasefinder.hose import Hose
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
29
        from logging import getLogger
30
        parent = getLogger("foo")
31
        h = Hose(log_parent=parent)
32
        self.assertEquals(h.log.parent, parent)
33
34
3691.84.3 by James Henstridge
fix canonical.dyson.hose + tests to work with FilterPattern
35
class Hose_Filter(unittest.TestCase):
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
36
    def testCreatesFilterObject(self):
37
        """Hose creates a Filter object."""
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
38
        from lp.registry.scripts.productreleasefinder.hose import Hose
39
        from lp.registry.scripts.productreleasefinder.filter import (
3691.84.7 by James Henstridge
rename files
40
            Filter)
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
41
        h = Hose()
42
        self.failUnless(isinstance(h.filter, Filter))
43
44
    def testDefaultsFiltersToEmptyDict(self):
45
        """Hose creates Filter object with empty dictionary."""
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
46
        from lp.registry.scripts.productreleasefinder.hose import Hose
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
47
        h = Hose()
3691.84.3 by James Henstridge
fix canonical.dyson.hose + tests to work with FilterPattern
48
        self.assertEquals(h.filter.filters, [])
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
49
50
    def testCreatesFiltersWithGiven(self):
51
        """Hose creates Filter object with dictionary given."""
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
52
        from lp.registry.scripts.productreleasefinder.hose import Hose
53
        from lp.registry.scripts.productreleasefinder.filter import (
3691.84.7 by James Henstridge
rename files
54
            FilterPattern)
3691.169.22 by James Henstridge
adjust product-release-finder code to work with single releasefileglob field
55
        pattern = FilterPattern("foo", "http:e*")
3691.84.3 by James Henstridge
fix canonical.dyson.hose + tests to work with FilterPattern
56
        h = Hose([pattern])
57
        self.assertEquals(len(h.filter.filters), 1)
58
        self.assertEquals(h.filter.filters[0], pattern)
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
59
60
4187.4.3 by Michael Hudson
change the tests in test_hose that used hct.scaffold to not do so any more.
61
class Hose_Urls(unittest.TestCase):
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
62
    def testCallsReduceWork(self):
63
        """Hose constructor calls reduceWork function."""
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
64
        from lp.registry.scripts.productreleasefinder.hose import Hose
4187.4.3 by Michael Hudson
change the tests in test_hose that used hct.scaffold to not do so any more.
65
        h = Hose.__new__(Hose)
66
        class Observer(InstrumentedMethodObserver):
67
            def __init__(self):
68
                self.called_it = False
69
            def called(self, name, args, kw):
70
                self.called_it = True
71
        obs = Observer()
72
        instrument_method(obs, h, "reduceWork")
73
        h.__init__()
74
        self.assert_(obs.called_it)
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
75
76
    def testPassesUrlList(self):
77
        """Hose constructor passes url list to reduceWork."""
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
78
        from lp.registry.scripts.productreleasefinder.hose import Hose
79
        from lp.registry.scripts.productreleasefinder.filter import (
3691.84.7 by James Henstridge
rename files
80
            FilterPattern)
3691.169.22 by James Henstridge
adjust product-release-finder code to work with single releasefileglob field
81
        pattern = FilterPattern("foo", "http://archive.ubuntu.com/e*")
4187.4.3 by Michael Hudson
change the tests in test_hose that used hct.scaffold to not do so any more.
82
        h = Hose.__new__(Hose)
83
        class Observer(InstrumentedMethodObserver):
84
            def __init__(self):
85
                self.args = []
86
            def called(self, name, args, kw):
87
                self.args.append(args)
88
        obs = Observer()
89
        instrument_method(obs, h, "reduceWork")
90
        h.__init__([pattern])
91
        self.assertEquals(obs.args[0][0],
3691.84.3 by James Henstridge
fix canonical.dyson.hose + tests to work with FilterPattern
92
                          ["http://archive.ubuntu.com/"])
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
93
94
    def testSetsUrlProperty(self):
95
        """Hose constructor sets urls property to reduceWork return value."""
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
96
        from lp.registry.scripts.productreleasefinder.hose import Hose
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
97
        class TestHose(Hose):
98
            def reduceWork(self, url_list):
99
                return "wibble"
100
101
        h = TestHose()
102
        self.assertEquals(h.urls, "wibble")
103
104
3691.84.3 by James Henstridge
fix canonical.dyson.hose + tests to work with FilterPattern
105
class Hose_ReduceWork(unittest.TestCase):
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
106
    def testEmptyList(self):
107
        """Hose.reduceWork returns empty list when given one."""
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
108
        from lp.registry.scripts.productreleasefinder.hose import Hose
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
109
        h = Hose()
110
        self.assertEquals(h.reduceWork([]), [])
111
112
    def testReducedList(self):
113
        """Hose.reduceWork returns same list when nothing to do."""
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
114
        from lp.registry.scripts.productreleasefinder.hose import Hose
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
115
        h = Hose()
116
        self.assertEquals(h.reduceWork(["http://localhost/", "file:///usr/"]),
117
                          ["http://localhost/", "file:///usr/"])
118
119
    def testReducesList(self):
120
        """Hose.reduceWork removes children elements from list."""
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
121
        from lp.registry.scripts.productreleasefinder.hose import Hose
1976 by Canonical.com Patch Queue Manager
dyson product release creator [r=dsilvers]
122
        h = Hose()
123
        self.assertEquals(h.reduceWork(["http://localhost/",
124
                                        "http://localhost/foo/bar/",
125
                                        "http://localhost/wibble/",
126
                                        "file:///usr/"]),
127
                          ["http://localhost/", "file:///usr/"])
128
129
3691.131.4 by James Henstridge
add support for limiting which subdirs get walked in Hose
130
class Hose_LimitWalk(unittest.TestCase):
131
132
    def setUp(self):
133
        self.release_root = tempfile.mkdtemp()
134
        self.release_url = 'file://' + self.release_root
135
136
    def tearDown(self):
137
        shutil.rmtree(self.release_root, ignore_errors=True)
138
        reset_logging()
139
140
    def testHoseLimitsWalk(self):
141
        # Test that the hose limits the directory walk to places that
142
        # could contain a match.
4785.3.7 by Jeroen Vermeulen
Removed whitespace at ends of lines
143
3691.131.4 by James Henstridge
add support for limiting which subdirs get walked in Hose
144
        # Set up the releases tree:
145
        for directory in ['bar',
146
                          'foo',
147
                          'foo/1.0',
148
                          'foo/1.0/source',
149
                          'foo/1.0/x64',
150
                          'foo/1.5',
151
                          'foo/1.5/source',
152
                          'foo/2.0',
153
                          'foo/2.0/source']:
154
            os.mkdir(os.path.join(self.release_root, directory))
155
        for releasefile in ['foo/1.0/foo-1.0.tar.gz',
156
                            'foo/1.0/source/foo-1.0.tar.gz',
157
                            'foo/1.0/source/foo-2.0.tar.gz',
158
                            'foo/1.0/x64/foo-1.0.tar.gz',
159
                            'foo/1.5/source/foo-1.5.tar.gz',
160
                            'foo/2.0/source/foo-2.0.tar.gz']:
161
            fp = open(os.path.join(self.release_root, releasefile), 'wb')
162
            fp.write('data')
163
            fp.close()
164
165
        # Run the hose over the test data
7675.110.3 by Curtis Hovey
Ran the migration script to move registry code to lp.registry.
166
        from lp.registry.scripts.productreleasefinder.hose import Hose
167
        from lp.registry.scripts.productreleasefinder.filter import (
3691.131.4 by James Henstridge
add support for limiting which subdirs get walked in Hose
168
            FilterPattern)
4785.3.7 by Jeroen Vermeulen
Removed whitespace at ends of lines
169
        pattern = FilterPattern("key", self.release_url +
3691.169.22 by James Henstridge
adjust product-release-finder code to work with single releasefileglob field
170
                                "/foo/1.*/source/foo-1.*.tar.gz")
3691.131.6 by James Henstridge
fixes from BjornT's review
171
        hose = Hose([pattern])
3691.131.4 by James Henstridge
add support for limiting which subdirs get walked in Hose
172
173
        prefix_len = len(self.release_url)
174
        matched = []
175
        unmatched = []
3691.131.6 by James Henstridge
fixes from BjornT's review
176
        for key, url in hose:
3691.131.4 by James Henstridge
add support for limiting which subdirs get walked in Hose
177
            if key is None:
178
                unmatched.append(url[prefix_len:])
179
            else:
180
                matched.append(url[prefix_len:])
181
3691.131.6 by James Henstridge
fixes from BjornT's review
182
        # Make sure that the correct releases got found.
3691.131.4 by James Henstridge
add support for limiting which subdirs get walked in Hose
183
        self.assertEqual(sorted(matched),
184
                         ['/foo/1.0/source/foo-1.0.tar.gz',
185
                          '/foo/1.5/source/foo-1.5.tar.gz'])
186
187
        # The only unmatched files that get checked exist in
188
        # directories that are parents of potential matches.
189
        self.assertEqual(sorted(unmatched),
190
                         ['/foo/1.0/foo-1.0.tar.gz',
191
                          '/foo/1.0/source/foo-2.0.tar.gz'])