~ubuntu-branches/ubuntu/lucid/landscape-client/lucid-updates

« back to all changes in this revision

Viewing changes to landscape/package/tests/helpers.py

  • Committer: Package Import Robot
  • Author(s): Andreas Hasenack
  • Date: 2012-04-10 14:28:48 UTC
  • mfrom: (1.1.27)
  • mto: This revision was merged to the branch mainline in revision 35.
  • Revision ID: package-import@ubuntu.com-20120410142848-7xsy4g2xii7y7ntc
ImportĀ upstreamĀ versionĀ 12.04.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
import base64
2
2
import os
3
 
 
4
 
import smart
5
 
 
6
 
from landscape.lib.fs import create_file
 
3
import textwrap
 
4
import time
 
5
 
 
6
try:
 
7
    import smart
 
8
except ImportError:
 
9
    # Smart is optional if AptFacade is being used.
 
10
    pass
 
11
 
 
12
import apt_inst
 
13
import apt_pkg
 
14
 
 
15
from landscape.lib.fs import append_file, create_file
 
16
from landscape.package.facade import AptFacade
 
17
 
 
18
 
 
19
class AptFacadeHelper(object):
 
20
    """Helper that sets up an AptFacade with a tempdir as its root."""
 
21
 
 
22
    def set_up(self, test_case):
 
23
        test_case.apt_root = test_case.makeDir()
 
24
        self.dpkg_status = os.path.join(
 
25
            test_case.apt_root, "var", "lib", "dpkg", "status")
 
26
        test_case.Facade = AptFacade
 
27
        test_case.facade = AptFacade(root=test_case.apt_root)
 
28
        test_case.facade.refetch_package_index = True
 
29
        test_case._add_system_package = self._add_system_package
 
30
        test_case._install_deb_file = self._install_deb_file
 
31
        test_case._add_package_to_deb_dir = self._add_package_to_deb_dir
 
32
        test_case._touch_packages_file = self._touch_packages_file
 
33
        test_case._hash_packages_by_name = self._hash_packages_by_name
 
34
 
 
35
    def _add_package(self, packages_file, name, architecture="all",
 
36
                     version="1.0", control_fields=None):
 
37
        if control_fields is None:
 
38
            control_fields = {}
 
39
        package_stanza = textwrap.dedent("""
 
40
                Package: %(name)s
 
41
                Priority: optional
 
42
                Section: misc
 
43
                Installed-Size: 1234
 
44
                Maintainer: Someone
 
45
                Architecture: %(architecture)s
 
46
                Source: source
 
47
                Version: %(version)s
 
48
                Description: description
 
49
                """ % {"name": name, "version": version,
 
50
                       "architecture": architecture})
 
51
        package_stanza = apt_pkg.rewrite_section(
 
52
            apt_pkg.TagSection(package_stanza), apt_pkg.REWRITE_PACKAGE_ORDER,
 
53
            control_fields.items())
 
54
        append_file(packages_file, "\n" + package_stanza + "\n")
 
55
 
 
56
    def _add_system_package(self, name, architecture="all", version="1.0",
 
57
                            control_fields=None):
 
58
        """Add a package to the dpkg status file."""
 
59
        system_control_fields = {"Status": "install ok installed"}
 
60
        if control_fields is not None:
 
61
            system_control_fields.update(control_fields)
 
62
        self._add_package(
 
63
            self.dpkg_status, name, architecture=architecture, version=version,
 
64
            control_fields=system_control_fields)
 
65
 
 
66
    def _install_deb_file(self, path):
 
67
        """Fake the the given deb file is installed in the system."""
 
68
        deb_file = open(path)
 
69
        deb = apt_inst.DebFile(deb_file)
 
70
        control = deb.control.extractdata("control")
 
71
        deb_file.close()
 
72
        lines = control.splitlines()
 
73
        lines.insert(1, "Status: install ok installed")
 
74
        status = "\n".join(lines)
 
75
        append_file(self.dpkg_status, status + "\n\n")
 
76
 
 
77
    def _add_package_to_deb_dir(self, path, name, architecture="all",
 
78
                                version="1.0", control_fields=None):
 
79
        """Add fake package information to a directory.
 
80
 
 
81
        There will only be basic information about the package
 
82
        available, so that get_packages() have something to return.
 
83
        There won't be an actual package in the dir.
 
84
        """
 
85
        if control_fields is None:
 
86
            control_fields = {}
 
87
        self._add_package(
 
88
            os.path.join(path, "Packages"), name, architecture=architecture,
 
89
            version=version, control_fields=control_fields)
 
90
 
 
91
    def _touch_packages_file(self, deb_dir):
 
92
        """Make sure the Packages file get a newer mtime value.
 
93
 
 
94
        If we rely on simply writing to the file to update the mtime, we
 
95
        might end up with the same as before, since the resolution is
 
96
        seconds, which causes apt to not reload the file.
 
97
        """
 
98
        packages_path = os.path.join(deb_dir, "Packages")
 
99
        mtime = int(time.time() + 1)
 
100
        os.utime(packages_path, (mtime, mtime))
 
101
 
 
102
    def _hash_packages_by_name(self, facade, store, package_name):
 
103
        """
 
104
        Ensure the named L{Package} is correctly recorded in the store so that
 
105
        we can really test the functions of the facade that depend on it.
 
106
        """
 
107
        hash_ids = {}
 
108
        for version in facade.get_packages_by_name(package_name):
 
109
            skeleton = facade.get_package_skeleton(
 
110
                version, with_info=False)
 
111
            hash = skeleton.get_hash()
 
112
            facade._pkg2hash[(version.package, version)] = hash
 
113
            hash_ids[hash] = version.package.id
 
114
        store.set_hash_ids(hash_ids)
 
115
 
 
116
 
 
117
class SimpleRepositoryHelper(object):
 
118
    """Helper for adding a simple repository to the facade.
 
119
 
 
120
    This helper requires that C{test_case.facade} has already been set
 
121
    up.
 
122
    """
 
123
 
 
124
    def set_up(self, test_case):
 
125
        test_case.repository_dir = test_case.makeDir()
 
126
        create_simple_repository(test_case.repository_dir)
 
127
        test_case.facade.add_channel_deb_dir(test_case.repository_dir)
7
128
 
8
129
 
9
130
class SmartHelper(object):
43
164
PKGNAME2 = "name2_version2-release2_all.deb"
44
165
PKGNAME3 = "name3_version3-release3_all.deb"
45
166
PKGNAME4 = "name3_version3-release4_all.deb"
 
167
PKGNAME_MINIMAL = "minimal_1.0_all.deb"
 
168
PKGNAME_SIMPLE_RELATIONS = "simple-relations_1.0_all.deb"
 
169
PKGNAME_VERSION_RELATIONS = "version-relations_1.0_all.deb"
 
170
PKGNAME_MULTIPLE_RELATIONS = "multiple-relations_1.0_all.deb"
 
171
PKGNAME_OR_RELATIONS = "or-relations_1.0_all.deb"
46
172
 
47
173
PKGDEB1 = ("ITxhcmNoPgpkZWJpYW4tYmluYXJ5ICAgMTE2NjExNDQ5MyAgMCAgICAgMCAgICAgMT"
48
174
           "AwNjQ0ICA0ICAgICAgICAgYAoyLjAKY29udHJvbC50YXIuZ3ogIDExNjYxMTQ0OTMg"
126
252
           "ENO8lcd9fP/LZ/d3f4td/6h+lqD0H+7W6ocl13wSAAAAAAAAAAAAAAAAAAfzAqr5\n"
127
253
           "GFYAKAAACg==\n")
128
254
 
 
255
PKGDEB_MINIMAL = (
 
256
    "ITxhcmNoPgpkZWJpYW4tYmluYXJ5ICAgMTMxNzg5MDQ3OSAgMCAgICAgMCAgICAgMTAwNj"
 
257
    "Q0ICA0 ICAgICAgICAgYAoyLjAKY29udHJvbC50YXIuZ3ogIDEzMTc4OTA0NzkgIDAgICA"
 
258
    "gIDAgICAgIDEw MDY0NCAgMjU4ICAgICAgIGAKH4sIAAAAAAACA+3Rz0rEMBAG8Jz7FPME"
 
259
    "3aT/FoqIC54EwZP3mB1s 1jQp0yz6+HaVBRFcTxWE7wfJQDKZHL5yo1anF9u2PVWzbfXXe"
 
260
    "qaM6Zq66pqurZQ2uqorRa36A8c5 WyFST4ck8ULfb/f/VLlxKWZJYeX8u6b5Mf+qbr7lb7"
 
261
    "rliDTyX92DdS/2mXsaffSjDcUjy+xT7MmU utiJG3xml4+ytNgQinvrY14WS093aYh0dVj"
 
262
    "2G36z4xS4dGm8Lm55duKn/DFmd55M0+dX9OrzQDHR nieOe47O80xJKOWBhYSDPb2cy0IB"
 
263
    "AAAAAAAAAAAAAAAAAAAAAMBF70s1/foAKAAAZGF0YS50YXIu Z3ogICAgIDEzMTc4OTA0N"
 
264
    "zkgIDAgICAgIDAgICAgIDEwMDY0NCAgMTA3ICAgICAgIGAKH4sIAAAA AAACA+3KsQ3CQB"
 
265
    "AEwCvlK4D/N4frMSGBkQz0jwmQiHCEo5lkpd09HOPv6mrMfGcbs37nR7R2Pg01"
 
266
    "ew5r32rvNUrGDp73x7SUEpfrbZl//LZ2AAAAAAAAAAAA2NELx33R7wAoAAAK")
 
267
 
 
268
PKGDEB_SIMPLE_RELATIONS = (
 
269
    "ITxhcmNoPgpkZWJpYW4tYmluYXJ5ICAgMTMxODUxNjMyMiAgMCAgICAgMCAgICAgMTAwNj"
 
270
    "Q0ICA0 ICAgICAgICAgYAoyLjAKY29udHJvbC50YXIuZ3ogIDEzMTg1MTYzMjIgIDAgICA"
 
271
    "gIDAgICAgIDEw MDY0NCAgMzQ0ICAgICAgIGAKH4sIAAAAAAACA+3R3UrDMBQH8F7nKc4L"
 
272
    "rGu2tYMi4tQrQRkI3mdp tNnSpKTZ0Lc37TYVQb2aIvx/0Ob09DQfPek4Obksmud5P/J5n"
 
273
    "n0cjxLOi1mez6ecT5KMZ5NJkVCe /IJtF4QnSlZr5+03dT+9/6fSsXQ2eGdO3P9iNvuy/3"
 
274
    "mWf+o/L6Y8oQz9P7mlkBvxpErqdNMaNfLK iKCd7diD8l0MSuJpxu6VDMNDozvJll47r8N"
 
275
    "LSa7t08KwhZe1DrFq6+NkwphYpEbXqlW26kpqvaqG mLO33DFx5eyj0TLElDyEnF16JTYx"
 
276
    "s+pHHidzO12pYaYh4uxWaBvipXxJN662dLaO9wv1LPqDpNI1 53GtTnrd7re+iJu3uhGG2"
 
277
    "v2hKdQiUC26w+Hp/fAU3Tna7f8BCa+OC1ekbfzwQ3HKEgAAAAAAAAAA AAAAAAAAAACAv/"
 
278
    "EKgcHt1gAoAABkYXRhLnRhci5neiAgICAgMTMxODUxNjMyMiAgMCAgICAgMCAg ICAgMTA"
 
279
    "wNjQ0ICAxMDcgICAgICAgYAofiwgAAAAAAAID7cqxDcJQEETBK8UVwH2b+64HQgIjGegf "
 
280
    "CJCIIMLRTPKC3d0+/i6f5qpX21z52bdorR+m7Fl9imw5jhVDxQbu19txHYY4nS/r8uX3aw"
 
281
    "cAAAAA AAAAAIANPQALnD6FACgAAAo=")
 
282
 
 
283
 
 
284
PKGDEB_VERSION_RELATIONS = (
 
285
    "ITxhcmNoPgpkZWJpYW4tYmluYXJ5ICAgMTMxODUxNjQ5OCAgMCAgICAgMCAgICAgMTAwNj"
 
286
    "Q0ICA0 ICAgICAgICAgYAoyLjAKY29udHJvbC50YXIuZ3ogIDEzMTg1MTY0OTggIDAgICA"
 
287
    "gIDAgICAgIDEw MDY0NCAgMzUwICAgICAgIGAKH4sIAAAAAAACA+3RQUvDMBQH8Jz7KXLU"
 
288
    "w7pmazcoczj1JAgDwXuW xTVbmpQkG/rtTds5RFBPGwj/H7R5fS9N07x0SM4ui6ZF0Y5sW"
 
289
    "mRfx0+EsUleFNNxznKSsWw0HhNa kAvY+8AdpWS1tc78Mu+v+j+VDoU1wVl95v5P8vzH/h"
 
290
    "eMfes/m7T9z9D/s1tyseMbWdKDdF5ZM3BS 8xADn7z0mZKyNEuepQjdQ628SJZOWafCe0l"
 
291
    "t06a5ThZOVCrEWXsXV+Nax0ly8CAbada+pI2T6y5m 9Gp2Q0dpdp2ciqfKsXBvzatWIsSS"
 
292
    "OIbta7O+euck38XSqh1jfj7v80tnD2otu491EUueuDIhXtKV 9NFWhs628X4r33jdaJkKW"
 
293
    "8/jLrxwqun/bhH/z6iaa9r0B0NDxQOtuKeng2n31C6qzObz1HyaEAAA AAAAAAAAAAAAAA"
 
294
    "AAAACAy/sAwTtOtwAoAABkYXRhLnRhci5neiAgICAgMTMxODUxNjQ5OCAgMCAg ICAgMCA"
 
295
    "gICAgMTAwNjQ0ICAxMDcgICAgICAgYAofiwgAAAAAAAID7cqxEcIwEETRK0UVgCT7UD0Q "
 
296
    "EpgZA/0DATNEEOHoveQHu7t9/F19GpmvtpH1s2/R2mGeemYfc9RW+9SjZGzgfr0d11LidL"
 
297
    "6sy5ff rx0AAAAAAAAAAAA29AD/ixlwACgAAAo=")
 
298
 
 
299
 
 
300
PKGDEB_MULTIPLE_RELATIONS = (
 
301
    "ITxhcmNoPgpkZWJpYW4tYmluYXJ5ICAgMTMxODU4MDA3OSAgMCAgICAgMCAgICAgMTAwNj"
 
302
    "Q0ICA0 ICAgICAgICAgYAoyLjAKY29udHJvbC50YXIuZ3ogIDEzMTg1ODAwNzkgIDAgICA"
 
303
    "gIDAgICAgIDEw MDY0NCAgMzgzICAgICAgIGAKH4sIAAAAAAACA+3RXUvDMBQG4F7nV5xL"
 
304
    "BVeb2nZQ5vDrShAGgvcx izaaNiXNRMEfb9atcwq6qwnC+8CW05N3bXcSH0d7lwTjPF+uf"
 
305
    "Jwn2+sg4rzI8nERYjxKeJJmaUR5 9AcWnReOKLp/sq75Jbdr/5+Kj6VtvLNmz+dfZNmP51"
 
306
    "+cZN/OnxdhmxKc/97NhHwWj6qkemG8bo0a OWWE17bp2J1yXShK4nHCbpX0/UWtO8lmTlu"
 
307
    "n/VtJtl22hWHnTlbah9TChdsJY0JIja5Uq5p5V1Lr 1LyvOR1MTimNk8Ojz2bKNsFNagit"
 
308
    "Gif0vq4yOphOv+yl7NI2D0ZLH34v1+XyOZN1bOil7MIp8RxS 98uVb92pb6Thne2Lnqv+h"
 
309
    "fuKHw1Vym6Ebnz4KFfSta0amjyF7zP1KuowuVjaehr+RyedblezOg/T anQtDLWrOZOvhK"
 
310
    "dKdJt504swC9XRg3WkhKxomH/MIgAAAAAAAAAAAAAAAAAAAACAHT4AFDs6bAAo AAAKZGF"
 
311
    "0YS50YXIuZ3ogICAgIDEzMTg1ODAwNzkgIDAgICAgIDAgICAgIDEwMDY0NCAgMTA3ICAg "
 
312
    "ICAgIGAKH4sIAAAAAAACA+3KsRHCMBBE0StFFYBkfFY9EBKYGWP3DwTMEEGEo/eSH+wejv"
 
313
    "F39aln vtp61s++RWvTeBpy6tmjtjqMLUrGDrb7el5Kicv1tsxffr92AAAAAAAAAAAA2NE"
 
314
    "Db6L1AQAoAAAK")
 
315
 
 
316
 
 
317
PKGDEB_OR_RELATIONS = (
 
318
    "ITxhcmNoPgpkZWJpYW4tYmluYXJ5ICAgMTMxNzg4ODg2OSAgMCAgICAgMCAgICAgMTAwNj"
 
319
    "Q0ICA0 ICAgICAgICAgYAoyLjAKY29udHJvbC50YXIuZ3ogIDEzMTc4ODg4NjkgIDAgICA"
 
320
    "gIDAgICAgIDEw MDY0NCAgMzc1ICAgICAgIGAKH4sIAAAAAAACA+3R30vDMBAH8D73r7g3"
 
321
    "FbS23brBUFHwSRAFwfeY HmtmlpQ08wf4x3vbWB2Cig8ThO8H2qbp3fXCZcfJzuViXFXLZ"
 
322
    "zGu8u3nRlIUo+GgHBXVUPaLvCwH CVXJH1h0UQWi5GHmg/sm7qfv/1R2rL2Lwdsdz380HH"
 
323
    "45f5n6p/kXo0GeUI7579yt0o9qyhPy4Siw VdF416X3HDpZTKjI8vSOdVy9zE2n09tgfDD"
 
324
    "xVTLa5bay6UXQjYkStQhSSFkrQXx0yS27uptQG7he rQvaPzmlMssP6O1jt0z7yD6sj9qE"
 
325
    "XCvjolwcJnTlG0cnM7mf84uat5Yz7ednUqbTwbTrXi+kW2fm ylK7PiHFRkVqVCcnpf6kW"
 
326
    "UrixtlX2uqZlKupXwcm47Rd1FwfUidLJh8b3qqyqr2qpJWTfzyxtC55 bi/2qfTcsJPvVi"
 
327
    "+WWW4qSdw3J301WZoAAAAAAAAAAAAAAAAAAAAAAPzOO2wqjioAKAAACmRhdGEu dGFyLmd"
 
328
    "6ICAgICAxMzE3ODg4ODY5ICAwICAgICAwICAgICAxMDA2NDQgIDEwNyAgICAgICBgCh+L "
 
329
    "CAAAAAAAAgPtyrsRwjAURNFXiioAfZBcjwkJzIyB/oGAGSIc4eic5Aa7h2P8XX6Zen+3TD"
 
330
    "1/9yNK"
 
331
    "GadWR2ltRC651hGpxw4et/u8phTny3Vdfvy2dgAAAAAAAAAAANjRE6Lr2rEAKAAACg==")
 
332
 
 
333
 
129
334
HASH1 = base64.decodestring("/ezv4AefpJJ8DuYFSq4RiEHJYP4=")
130
335
HASH2 = base64.decodestring("glP4DwWOfMULm0AkRXYsH/exehc=")
131
336
HASH3 = base64.decodestring("NJM05mj86veaSInYxxqL1wahods=")
133
338
HASH5 = '|\x93K\xe0gx\xba\xe4\x85\x84\xd9\xf4%\x8bB\xbdR\x97\xdb\xfc'
134
339
HASH6 = '\xedt!=,\\\rk\xa7\xe3$\xfb\x06\x9c\x88\x92)\xc2\xfb\xd6'
135
340
HASH7 = 'D\xb1\xb6\xf5\xaa\xa8i\x84\x07#x\x97\x01\xf7`.\x9b\xde\xfb '
 
341
HASH_MINIMAL = "6\xce\x8f\x1bM\x82MWZ\x1a\xffjAc(\xdb(\xa1\x0eG"
 
342
HASH_SIMPLE_RELATIONS = (
 
343
    "'#\xab&k\xe6\xf5E\xcfB\x9b\xceO7\xe6\xec\xa9\xddY\xaa")
 
344
HASH_VERSION_RELATIONS = (
 
345
    '\x84\xc9\xb4\xb3\r\x95\x16\x03\x95\x98\xc0\x14u\x06\xf7eA\xe65\xd1')
 
346
HASH_MULTIPLE_RELATIONS = (
 
347
    '\xec\xcdi\xdc\xde-\r\xc3\xd3\xc9s\x84\xe4\xc3\xd6\xc4\x12T\xa6\x0e')
 
348
HASH_OR_RELATIONS = (
 
349
    '\xa1q\xf4*\x1c\xd4L\xa1\xca\xf1\xfa?\xc3\xc7\x9f\x88\xd53B\xc9')
136
350
 
137
351
RELEASES = {"hardy": """Origin: Ubuntu
138
352
Label: Ubuntu
369
583
 
370
584
        codename = "hardy"
371
585
        variant = "hardy-updates"
372
 
        components = "main restricted"
 
586
        components = ["main", "restricted"]
373
587
        archs = ["amd64", "i386"]
374
588
        hashes = [HASH4, HASH5, HASH6, HASH7]
375
589
 
386
600
        fd = open(os.path.join(dist_directory, "Release"), "w")
387
601
        fd.write(RELEASES[dist])
388
602
        fd.close()
389
 
        for component in repository.components.split():
 
603
        for component in repository.components:
390
604
            component_directory = os.path.join(dist_directory, component)
391
605
            os.mkdir(component_directory)
392
606
            for arch in repository.archs: