~lutostag/ubuntu/trusty/maas/1.5.2+packagefix

« back to all changes in this revision

Viewing changes to src/provisioningserver/boot/tests/test_utils.py

  • Committer: Package Import Robot
  • Author(s): Andres Rodriguez
  • Date: 2014-03-28 10:43:53 UTC
  • mto: This revision was merged to the branch mainline in revision 57.
  • Revision ID: package-import@ubuntu.com-20140328104353-ekpolg0pm5xnvq2s
Tags: upstream-1.5+bzr2204
ImportĀ upstreamĀ versionĀ 1.5+bzr2204

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright 2014 Canonical Ltd.  This software is licensed under the
 
2
# GNU Affero General Public License version 3 (see the file LICENSE).
 
3
 
 
4
"""Tests for `provisioningserver.boot.utils`."""
 
5
 
 
6
from __future__ import (
 
7
    absolute_import,
 
8
    print_function,
 
9
    unicode_literals,
 
10
    )
 
11
 
 
12
str = None
 
13
 
 
14
__metaclass__ = type
 
15
__all__ = []
 
16
 
 
17
from maastesting.factory import factory
 
18
from maastesting.matchers import (
 
19
    MockCalledOnceWith,
 
20
    MockCallsMatch,
 
21
    )
 
22
from maastesting.testcase import MAASTestCase
 
23
from mock import call
 
24
from provisioningserver.boot import utils
 
25
 
 
26
 
 
27
class TestBootMethodUtils(MAASTestCase):
 
28
    """Test for `BootMethod` in `provisioningserver.boot.utils`."""
 
29
 
 
30
    def test_get_packages(self):
 
31
        archive = factory.make_name("archive")
 
32
        comp, arch, release = factory.make_names("comp", "arch", "release")
 
33
        release_gpg = factory.getRandomString()
 
34
        packages_gz = factory.getRandomString()
 
35
 
 
36
        url = utils.urljoin(archive, 'dists', release)
 
37
        release_url = utils.urljoin(url, 'Release')
 
38
        release_gpg_url = utils.urljoin(url, 'Release.gpg')
 
39
        packages_path = '%s/binary-%s/Packages.gz' % (comp, arch)
 
40
        packages_url = utils.urljoin(url, packages_path)
 
41
        packages_gz_md5 = utils.get_md5sum(packages_gz)
 
42
        release_data = "  %s  012 %s" % (packages_gz_md5, packages_path)
 
43
 
 
44
        get_file = self.patch(utils, "get_file")
 
45
        get_file.side_effect = [release_data, release_gpg, packages_gz]
 
46
        verify_data = self.patch(utils, "gpg_verify_data")
 
47
        decompress = self.patch(utils, "decompress_packages")
 
48
 
 
49
        utils.get_packages(archive, comp, arch, release)
 
50
 
 
51
        self.assertThat(
 
52
            verify_data,
 
53
            MockCalledOnceWith(release_gpg, release_data))
 
54
        self.assertThat(
 
55
            decompress,
 
56
            MockCalledOnceWith(packages_gz))
 
57
        self.assertThat(
 
58
            get_file,
 
59
            MockCallsMatch(
 
60
                call(release_url),
 
61
                call(release_gpg_url),
 
62
                call(packages_url)))
 
63
 
 
64
    def test_get_packages_errors_on_invalid_checksum(self):
 
65
        archive = factory.make_name("archive")
 
66
        comp, arch, release = factory.make_names("comp", "arch", "release")
 
67
        release_gpg = factory.getRandomString()
 
68
        packages_gz = factory.getRandomString()
 
69
 
 
70
        packages_path = '%s/binary-%s/Packages.gz' % (comp, arch)
 
71
        packages_gz_md5 = utils.get_md5sum(packages_gz + '0')
 
72
        release_data = "  %s  012 %s" % (packages_gz_md5, packages_path)
 
73
 
 
74
        get_file = self.patch(utils, "get_file")
 
75
        get_file.side_effect = [release_data, release_gpg, packages_gz]
 
76
        self.patch(utils, "gpg_verify_data")
 
77
        self.patch(utils, "decompress_packages")
 
78
 
 
79
        self.assertRaises(
 
80
            ValueError, utils.get_packages, archive,
 
81
            comp, arch, release)
 
82
 
 
83
    def test_get_package_info(self):
 
84
        package = factory.make_name("package")
 
85
        archive = factory.make_name("archive")
 
86
        comp, arch, release = factory.make_names("comp", "arch", "release")
 
87
 
 
88
        package_items = {}
 
89
        package_list = "Package: %s\n" % package
 
90
        for _ in range(5):
 
91
            key, value = factory.make_names("key", "value")
 
92
            package_items[key] = value
 
93
            package_list += "%s: %s\n" % (key, value)
 
94
        package_list += "\n"
 
95
 
 
96
        get_packages = self.patch(utils, "get_packages")
 
97
        get_packages.return_value = package_list
 
98
 
 
99
        output = utils.get_package_info(
 
100
            package, archive, comp, arch, release)
 
101
 
 
102
        self.assertEqual(package, output['Package'])
 
103
        for key, value in package_items.items():
 
104
            self.assertEqual(value, output[key])
 
105
 
 
106
    def test_get_package(self):
 
107
        package = factory.make_name("package")
 
108
        filename = factory.make_name("filename")
 
109
        archive = factory.make_name("archive")
 
110
        comp, arch, release = factory.make_names("comp", "arch", "release")
 
111
 
 
112
        package_data = factory.getRandomString()
 
113
        package_md5 = utils.get_md5sum(package_data)
 
114
        package_info = {
 
115
            'Package': package,
 
116
            'Filename': filename,
 
117
            'MD5sum': package_md5
 
118
        }
 
119
 
 
120
        get_package_info = self.patch(utils, "get_package_info")
 
121
        get_package_info.return_value = package_info
 
122
 
 
123
        get_file = self.patch(utils, "get_file")
 
124
        get_file.return_value = package_data
 
125
 
 
126
        data, fn = utils.get_package(
 
127
            package, archive, comp, arch, release)
 
128
 
 
129
        url = utils.urljoin(archive, filename)
 
130
        self.assertThat(get_file, MockCalledOnceWith(url))
 
131
        self.assertEqual(package_data, data)
 
132
        self.assertEqual(filename, fn)
 
133
 
 
134
    def test_get_package_errors_on_invalid_checksum(self):
 
135
        package = factory.make_name("package")
 
136
        filename = factory.make_name("filename")
 
137
        archive = factory.make_name("archive")
 
138
        comp, arch, release = factory.make_names("comp", "arch", "release")
 
139
 
 
140
        package_data = factory.getRandomString()
 
141
        package_md5 = utils.get_md5sum(package_data + '0')
 
142
        package_info = {
 
143
            'Package': package,
 
144
            'Filename': filename,
 
145
            'MD5sum': package_md5
 
146
        }
 
147
 
 
148
        get_package_info = self.patch(utils, "get_package_info")
 
149
        get_package_info.return_value = package_info
 
150
 
 
151
        get_file = self.patch(utils, "get_file")
 
152
        get_file.return_value = package_data
 
153
 
 
154
        self.assertRaises(
 
155
            ValueError, utils.get_package, package,
 
156
            archive, comp, arch, release)
 
157
 
 
158
    def test_get_updates_package(self):
 
159
        package = factory.make_name("package")
 
160
        archive = factory.make_name("archive")
 
161
        comp, arch, release = factory.make_names("comp", "arch", "release")
 
162
 
 
163
        get_package = self.patch(utils, "get_package")
 
164
        get_package.return_value = (None, None)
 
165
 
 
166
        utils.get_updates_package(package, archive, comp, arch, release)
 
167
 
 
168
        updates = '%s-updates' % release
 
169
        self.assertThat(
 
170
            get_package,
 
171
            MockCallsMatch(
 
172
                call(package, archive, comp, arch, release=updates),
 
173
                call(package, archive, comp, arch, release=release)))