~ubuntu-branches/debian/squeeze/bzr-builddeb/squeeze

« back to all changes in this revision

Viewing changes to tests/__init__.py

  • Committer: Bazaar Package Importer
  • Author(s): Jelmer Vernooij
  • Date: 2010-01-18 19:15:26 UTC
  • mfrom: (5.1.5 karmic)
  • Revision ID: james.westby@ubuntu.com-20100118191526-fzyw0n60z6vrhhhn
Tags: 2.2
* Upload to unstable.
* Bump standards version to 3.8.3.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
#
20
20
 
21
21
import shutil
 
22
import subprocess
22
23
import tarfile
23
24
import zipfile
24
25
 
29
30
 
30
31
from debian_bundle.changelog import Version, Changelog
31
32
 
32
 
from bzrlib.tests import TestUtil, adapt_modules, TestCaseWithTransport
 
33
from bzrlib.tests import TestUtil, multiply_tests, TestCaseWithTransport
33
34
 
34
35
from bzrlib.plugins.builddeb.tests import blackbox
35
36
 
36
37
 
37
 
def make_new_upstream_dir(dir):
38
 
  def _make_upstream_dir():
39
 
    os.rename('package-0.2', dir)
40
 
  return _make_upstream_dir
41
 
 
42
 
def make_new_upstream_tarball(tarball):
43
 
  def _make_upstream_tarball():
44
 
    tar = tarfile.open(tarball, 'w:gz')
45
 
    try:
46
 
      tar.add('package-0.2')
47
 
    finally:
48
 
      tar.close()
49
 
    shutil.rmtree('package-0.2')
50
 
  return _make_upstream_tarball
51
 
 
52
 
def make_new_upstream_tarball_bz2(tarball):
53
 
  def _make_upstream_tarball():
54
 
    tar = tarfile.open(tarball, 'w:bz2')
55
 
    try:
56
 
      tar.add('package-0.2')
57
 
    finally:
58
 
      tar.close()
59
 
    shutil.rmtree('package-0.2')
60
 
  return _make_upstream_tarball
61
 
 
62
 
def make_new_upstream_tarball_zip(tarball):
63
 
  def _make_upstream_tarball():
64
 
    zip = zipfile.ZipFile(tarball, 'w')
65
 
    try:
66
 
      zip.writestr('package-0.2/', '')
67
 
      for (dirpath, dirnames, names) in os.walk('package-0.2'):
68
 
        for dir in dirnames:
69
 
          zip.writestr(os.path.join(dirpath, dir, ''), '')
70
 
        for name in names:
71
 
          zip.write(os.path.join(dirpath, name))
72
 
    finally:
73
 
      zip.close()
74
 
    shutil.rmtree('package-0.2')
75
 
  return _make_upstream_tarball
76
 
 
77
 
def make_new_upstream_tarball_bare(tarball):
78
 
  def _make_upstream_tarball():
79
 
    tar = tarfile.open(tarball, 'w')
80
 
    try:
81
 
      tar.add('package-0.2')
82
 
    finally:
83
 
      tar.close()
84
 
    shutil.rmtree('package-0.2')
85
 
  return _make_upstream_tarball
 
38
def make_new_upstream_dir(source, dest):
 
39
    os.rename(source, dest)
 
40
 
 
41
 
 
42
def make_new_upstream_tarball(source, dest):
 
43
    tar = tarfile.open(dest, 'w:gz')
 
44
    try:
 
45
        tar.add(source)
 
46
    finally:
 
47
        tar.close()
 
48
    shutil.rmtree(source)
 
49
 
 
50
 
 
51
def make_new_upstream_tarball_bz2(source, dest):
 
52
    tar = tarfile.open(dest, 'w:bz2')
 
53
    try:
 
54
        tar.add(source)
 
55
    finally:
 
56
        tar.close()
 
57
    shutil.rmtree(source)
 
58
 
 
59
 
 
60
def make_new_upstream_tarball_zip(source, dest):
 
61
    zip = zipfile.ZipFile(dest, 'w')
 
62
    try:
 
63
        zip.writestr(source, '')
 
64
        for (dirpath, dirnames, names) in os.walk(source):
 
65
            for dir in dirnames:
 
66
                zip.writestr(os.path.join(dirpath, dir, ''), '')
 
67
            for name in names:
 
68
                zip.write(os.path.join(dirpath, name))
 
69
    finally:
 
70
        zip.close()
 
71
    shutil.rmtree(source)
 
72
 
 
73
 
 
74
def make_new_upstream_tarball_bare(source, dest):
 
75
    tar = tarfile.open(dest, 'w')
 
76
    try:
 
77
        tar.add(source)
 
78
    finally:
 
79
        tar.close()
 
80
    shutil.rmtree(source)
 
81
 
86
82
 
87
83
tarball_functions = [('dir', make_new_upstream_dir, '../package-0.2'),
88
84
                     ('.tar.gz', make_new_upstream_tarball,
96
92
                     ]
97
93
 
98
94
 
99
 
class MergeUpstreamAdaptor(object):
100
 
 
101
 
  def adapt(self, test):
102
 
    result = TestSuite()
103
 
    for (name, function, source) in tarball_functions:
104
 
      new_test = deepcopy(test)
105
 
      new_test.build_tarball = function(source)
106
 
      new_test.upstream_tarball = source
107
 
      def make_new_id():
108
 
        new_id = '%s(%s)' % (test.id(), name)
109
 
        return lambda: new_id
110
 
      new_test.id = make_new_id()
111
 
      result.addTest(new_test)
112
 
    return result
113
 
 
114
 
 
115
95
class RepackTarballAdaptor(object):
116
96
 
117
 
  def adapt(self, test):
118
 
    result = TestSuite()
119
 
    for (name, function, source) in tarball_functions:
120
 
      # XXX: Zip files are horrible, but work out how to repack them.
121
 
      if name == '.zip':
122
 
        continue
123
 
      new_test = deepcopy(test)
124
 
      source = os.path.basename(source)
125
 
      new_test.build_tarball = function(source)
126
 
      new_test.old_tarball = source
127
 
      def make_new_id():
128
 
        new_id = '%s(%s)' % (test.id(), name)
129
 
        return lambda: new_id
130
 
      new_test.id = make_new_id()
131
 
      result.addTest(new_test)
132
 
    return result
 
97
    def adapt(self, test):
 
98
        result = TestSuite()
 
99
        for (name, function, source) in tarball_functions:
 
100
            new_test = deepcopy(test)
 
101
            source = os.path.basename(source)
 
102
            new_test.build_tarball = function(source)
 
103
            new_test.old_tarball = source
 
104
            def make_new_id():
 
105
                new_id = '%s(%s)' % (test.id(), name)
 
106
                return lambda: new_id
 
107
            new_test.id = make_new_id()
 
108
            result.addTest(new_test)
 
109
        return result
133
110
 
134
111
 
135
112
def test_suite():
137
114
    suite = TestSuite()
138
115
    testmod_names = [
139
116
            'test_builder',
 
117
            'test_commit_message',
140
118
            'test_config',
141
119
            'test_hooks',
142
120
            'test_import_dsc',
 
121
            'test_merge_package',
 
122
            'test_merge_upstream',
143
123
            'test_repack_tarball_extra',
 
124
            'test_revspec',
 
125
            'test_source_distiller',
 
126
            'test_upstream',
144
127
            'test_util',
145
128
            ]
146
129
    suite.addTest(loader.loadTestsFromModuleNames(["%s.%s" % (__name__, i)
151
134
             'config'
152
135
             ]
153
136
    for mod in doctest_mod_names:
154
 
      suite.addTest(doctest.DocTestSuite(mod))
155
 
 
156
 
    adapt_modules(['%s.test_merge_upstream' % __name__],
157
 
                  MergeUpstreamAdaptor(), loader, suite)
158
 
    adapt_modules(['%s.test_repack_tarball' % __name__],
159
 
                  RepackTarballAdaptor(), loader, suite)
160
 
 
 
137
        suite.addTest(doctest.DocTestSuite("bzrlib.plugins.builddeb." + mod))
 
138
    repack_tarball_tests = loader.loadTestsFromModuleNames(
 
139
            ['%s.test_repack_tarball' % __name__])
 
140
    scenarios = [('dir', dict(build_tarball=make_new_upstream_dir,
 
141
                              old_tarball='../package-0.2')),
 
142
                 ('.tar.gz', dict(build_tarball=make_new_upstream_tarball,
 
143
                              old_tarball='../package-0.2.tar.gz')),
 
144
                 ('.tar.bz2', dict(build_tarball=make_new_upstream_tarball_bz2,
 
145
                              old_tarball='../package-0.2.tar.bz2')),
 
146
                 ('.zip', dict(build_tarball=make_new_upstream_tarball_zip,
 
147
                              old_tarball='../package-0.2.zip')),
 
148
                 ('.tar', dict(build_tarball=make_new_upstream_tarball_bare,
 
149
                              old_tarball='../package-0.2.tar')),
 
150
                 ]
 
151
    suite = multiply_tests(repack_tarball_tests, scenarios, suite)
161
152
    packages_to_test = [
162
153
             blackbox,
163
154
             ]
164
155
 
165
156
    for package in packages_to_test:
166
 
      suite.addTest(package.test_suite())
 
157
        suite.addTest(package.test_suite())
167
158
 
168
159
    return suite
169
160
 
170
161
class BuilddebTestCase(TestCaseWithTransport):
171
162
 
172
 
  package_name = 'test'
173
 
  package_version = Version('0.1-1')
174
 
  upstream_version = property(lambda self: \
175
 
                              self.package_version.upstream_version)
176
 
 
177
 
  def make_changelog(self, version=None):
178
 
    if version is None:
179
 
      version = self.package_version
180
 
    c = Changelog()
181
 
    c.new_block()
182
 
    c.version = Version(version)
183
 
    c.package = self.package_name
184
 
    c.distributions = 'unstable'
185
 
    c.urgency = 'low'
186
 
    c.author = 'James Westby <jw+debian@jameswestby.net>'
187
 
    c.date = 'Thu,  3 Aug 2006 19:16:22 +0100'
188
 
    c.add_change('')
189
 
    c.add_change('  *  test build')
190
 
    c.add_change('')
191
 
    return c
192
 
 
193
 
  def write_changelog(self, changelog, filename):
194
 
    f = open(filename, 'w')
195
 
    changelog.write_to_open_file(f)
196
 
    f.close()
197
 
 
198
 
  def check_tarball_contents(self, tarball, expected, basedir=None,
 
163
    package_name = 'test'
 
164
    package_version = Version('0.1-1')
 
165
    upstream_version = property(lambda self: \
 
166
                                self.package_version.upstream_version)
 
167
 
 
168
    def make_changelog(self, version=None):
 
169
        if version is None:
 
170
            version = self.package_version
 
171
        c = Changelog()
 
172
        c.new_block()
 
173
        c.version = Version(version)
 
174
        c.package = self.package_name
 
175
        c.distributions = 'unstable'
 
176
        c.urgency = 'low'
 
177
        c.author = 'James Westby <jw+debian@jameswestby.net>'
 
178
        c.date = 'Thu,  3 Aug 2006 19:16:22 +0100'
 
179
        c.add_change('')
 
180
        c.add_change('  *  test build')
 
181
        c.add_change('')
 
182
        return c
 
183
 
 
184
    def write_changelog(self, changelog, filename):
 
185
        f = open(filename, 'w')
 
186
        changelog.write_to_open_file(f)
 
187
        f.close()
 
188
 
 
189
    def check_tarball_contents(self, tarball, expected, basedir=None,
199
190
                             skip_basedir=False, mode=None):
200
 
    """Test that the tarball has certain contents.
201
 
 
202
 
    Test that the tarball has exactly expected contents. The basedir
203
 
    is checked for and prepended if it is not None. The mode is the mode
204
 
    used in tarfile.open defaults to r:gz. If skip_basedir is True and
205
 
    basedir is not None then the basedir wont be tested for itself.
 
191
        """Test that the tarball has certain contents.
 
192
 
 
193
        Test that the tarball has exactly expected contents. The basedir
 
194
        is checked for and prepended if it is not None. The mode is the mode
 
195
        used in tarfile.open defaults to r:gz. If skip_basedir is True and
 
196
        basedir is not None then the basedir wont be tested for itself.
 
197
        """
 
198
        if basedir is None:
 
199
            real_expected = expected[:]
 
200
        else:
 
201
            if skip_basedir:
 
202
                real_expected = []
 
203
            else:
 
204
                real_expected = [basedir]
 
205
        for item in expected:
 
206
            real_expected.append(os.path.join(basedir, item).rstrip("/"))
 
207
        extras = []
 
208
        tar = tarfile.open(tarball, 'r:gz')
 
209
        try:
 
210
            for tarinfo in tar:
 
211
                if tarinfo.name in real_expected:
 
212
                    index = real_expected.index(tarinfo.name)
 
213
                    del real_expected[index:index+1]
 
214
                else:
 
215
                    extras.append(tarinfo.name)
 
216
 
 
217
            if len(real_expected) > 0:
 
218
                self.fail("Files not found in %s: %s"
 
219
                        % (tarball, ", ".join(real_expected)))
 
220
            if len(extras) > 0:
 
221
                self.fail("Files not expected to be found in %s: %s"
 
222
                        % (tarball, ", ".join(extras)))
 
223
        finally:
 
224
            tar.close()
 
225
 
 
226
 
 
227
class SourcePackageBuilder(object):
 
228
    """An interface to ease building source packages.
 
229
 
 
230
    >>> builder = SourcePackageBuilder("package", Version("0.1-1"))
 
231
    >>> builder.add_upstream_file("foo")
 
232
    >>> builder.add_debian_file("debian/copyright")
 
233
    >>> builder.add_default_control()
 
234
    >>> builder.build()
 
235
    >>> builder.new_version(Version("0.2-1"))
 
236
    >>> builder.add_upstream_file("bar")
 
237
    >>> builder.remove_upstream_file("foo")
 
238
    >>> builder.build()
 
239
    >>> builder.dsc_name()
206
240
    """
207
 
    if basedir is None:
208
 
      real_expected = expected[:]
209
 
    else:
210
 
      if skip_basedir:
211
 
        real_expected = []
212
 
      else:
213
 
        real_expected = [basedir]
214
 
      for item in expected:
215
 
        real_expected.append(os.path.join(basedir, item))
216
 
    extras = []
217
 
    tar = tarfile.open(tarball, 'r:gz')
218
 
    try:
219
 
      for tarinfo in tar:
220
 
        if tarinfo.name in real_expected:
221
 
          index = real_expected.index(tarinfo.name)
222
 
          del real_expected[index:index+1]
223
 
        else:
224
 
            extras.append(tarinfo.name)
225
 
 
226
 
      if len(real_expected) > 0:
227
 
        self.fail("Files not found in %s: %s" % (tarball,
228
 
                                                 ", ".join(real_expected)))
229
 
      if len(extras) > 0:
230
 
        self.fail("Files not expected to be found in %s: %s" % (tarball,
231
 
                                                 ", ".join(extras)))
232
 
    finally:
233
 
      tar.close()
234
 
 
235
 
# vim: ts=2 sts=2 sw=2
236
 
 
 
241
 
 
242
    def __init__(self, name, version, native=False):
 
243
        self.upstream_files = {}
 
244
        self.upstream_symlinks = {}
 
245
        self.debian_files = {}
 
246
        self.name = name
 
247
        self.native = native
 
248
        self._cl = Changelog()
 
249
        self.new_version(version)
 
250
 
 
251
    def add_upstream_file(self, name, content=None):
 
252
        self.add_upstream_files([(name, content)])
 
253
 
 
254
    def add_upstream_files(self, files):
 
255
        for new_file in files:
 
256
            self.upstream_files[new_file[0]] = new_file[1]
 
257
 
 
258
    def add_upstream_symlink(self, name, target):
 
259
        self.upstream_symlinks[name] = target
 
260
 
 
261
    def remove_upstream_file(self, filename):
 
262
        del self.upstream_files[filename]
 
263
 
 
264
    def add_debian_file(self, name, content=None):
 
265
        self.add_debian_files([(name, content)])
 
266
 
 
267
    def add_debian_files(self, files):
 
268
        for new_file in files:
 
269
            self.debian_files[new_file[0]] = new_file[1]
 
270
 
 
271
    def remove_debian_file(self, filename):
 
272
        del self.debian_files[filename]
 
273
 
 
274
    def add_default_control(self):
 
275
        text = """Source: %s\nSection: misc\n""" % self.name
 
276
        text += "Priority: optional\n"
 
277
        text += "Maintainer: Maintainer <nobody@ubuntu.com>\n"
 
278
        self.add_debian_file("debian/control", text)
 
279
 
 
280
    def new_version(self, version, change_text=None):
 
281
        self._cl.new_block(package=self.name, version=version,
 
282
                distributions="unstable", urgency="low",
 
283
                author="Maint <maint@maint.org>",
 
284
                date="Wed, 19 Mar 2008 21:27:37 +0000")
 
285
        if change_text is None:
 
286
            self._cl.add_change("  * foo")
 
287
        else:
 
288
            self._cl.add_change(change_text)
 
289
 
 
290
    def dsc_name(self):
 
291
        return "%s_%s.dsc" % (self.name, str(self._cl.version))
 
292
 
 
293
    def tar_name(self):
 
294
        if self.native:
 
295
            return "%s_%s.tar.gz" % (self.name, str(self._cl.version))
 
296
        return "%s_%s.orig.tar.gz" % (self.name,
 
297
                str(self._cl.version.upstream_version))
 
298
 
 
299
    def diff_name(self):
 
300
        assert not self.native, "Can't have a diff with a native package"
 
301
        return "%s_%s.diff.gz" % (self.name, str(self._cl.version))
 
302
 
 
303
    def changes_name(self):
 
304
        return "%s_%s_source.changes" % (self.name, str(self._cl.version))
 
305
 
 
306
    def _make_files(self, files_list, basedir):
 
307
        for (path, content) in files_list.items():
 
308
            dirname = os.path.dirname(path)
 
309
            if dirname is not None and dirname != "":
 
310
                if not os.path.exists(os.path.join(basedir, dirname)):
 
311
                    os.makedirs(os.path.join(basedir, dirname))
 
312
            f = open(os.path.join(basedir, path), 'wb')
 
313
            try:
 
314
                if content is None:
 
315
                    content = ''
 
316
                f.write(content)
 
317
            finally:
 
318
                f.close()
 
319
 
 
320
    def _make_symlinks(self, files_list, basedir):
 
321
        for (path, target) in files_list.items():
 
322
            dirname = os.path.dirname(path)
 
323
            if dirname is not None and dirname != "":
 
324
                if not os.path.exists(os.path.join(basedir, dirname)):
 
325
                    os.makedirs(os.path.join(basedir, dirname))
 
326
            os.symlink(target, os.path.join(basedir, path))
 
327
 
 
328
    def basedir(self):
 
329
        return self.name + "-" + str(self._cl.version.upstream_version)
 
330
 
 
331
    def _make_base(self):
 
332
        basedir = self.basedir()
 
333
        os.mkdir(basedir)
 
334
        self._make_files(self.upstream_files, basedir)
 
335
        self._make_symlinks(self.upstream_symlinks, basedir)
 
336
        return basedir
 
337
 
 
338
    def build(self):
 
339
        basedir = self._make_base()
 
340
        if not self.native:
 
341
            orig_basedir = basedir + ".orig"
 
342
            shutil.copytree(basedir, orig_basedir, symlinks=True)
 
343
            cmd = "dpkg-source -sa -b %s" % (basedir)
 
344
            if os.path.exists("%s_%s.orig.tar.gz"
 
345
                    % (self.name, self._cl.version.upstream_version)):
 
346
                cmd = "dpkg-source -ss -b %s" % (basedir)
 
347
        else:
 
348
            cmd = "dpkg-source -sn -b %s" % (basedir)
 
349
        self._make_files(self.debian_files, basedir)
 
350
        self._make_files({"debian/changelog": str(self._cl)}, basedir)
 
351
        proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
 
352
                stderr=subprocess.PIPE)
 
353
        ret = proc.wait()
 
354
        assert ret == 0, "dpkg-source failed, output:\n%s\n%s" % \
 
355
                (proc.stdout.read(), proc.stderr.read())
 
356
        cmd = "dpkg-genchanges -S > ../%s" % self.changes_name()
 
357
        proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
 
358
                stderr=subprocess.PIPE, cwd=basedir)
 
359
        ret = proc.wait()
 
360
        assert ret == 0, "dpkg-genchanges failed, output:\n%s\n%s" % \
 
361
                (proc.stdout.read(), proc.stderr.read())
 
362
        shutil.rmtree(basedir)