1
# Copyright 2014 Canonical Ltd. This software is licensed under the
2
# GNU Affero General Public License version 3 (see the file LICENSE).
4
"""Tests for `provisioningserver.boot.utils`."""
6
from __future__ import (
17
from maastesting.factory import factory
18
from maastesting.matchers import (
22
from maastesting.testcase import MAASTestCase
24
from provisioningserver.boot import utils
27
class TestBootMethodUtils(MAASTestCase):
28
"""Test for `BootMethod` in `provisioningserver.boot.utils`."""
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()
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)
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")
49
utils.get_packages(archive, comp, arch, release)
53
MockCalledOnceWith(release_gpg, release_data))
56
MockCalledOnceWith(packages_gz))
61
call(release_gpg_url),
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()
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)
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")
80
ValueError, utils.get_packages, archive,
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")
89
package_list = "Package: %s\n" % package
91
key, value = factory.make_names("key", "value")
92
package_items[key] = value
93
package_list += "%s: %s\n" % (key, value)
96
get_packages = self.patch(utils, "get_packages")
97
get_packages.return_value = package_list
99
output = utils.get_package_info(
100
package, archive, comp, arch, release)
102
self.assertEqual(package, output['Package'])
103
for key, value in package_items.items():
104
self.assertEqual(value, output[key])
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")
112
package_data = factory.getRandomString()
113
package_md5 = utils.get_md5sum(package_data)
116
'Filename': filename,
117
'MD5sum': package_md5
120
get_package_info = self.patch(utils, "get_package_info")
121
get_package_info.return_value = package_info
123
get_file = self.patch(utils, "get_file")
124
get_file.return_value = package_data
126
data, fn = utils.get_package(
127
package, archive, comp, arch, release)
129
url = utils.urljoin(archive, filename)
130
self.assertThat(get_file, MockCalledOnceWith(url))
131
self.assertEqual(package_data, data)
132
self.assertEqual(filename, fn)
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")
140
package_data = factory.getRandomString()
141
package_md5 = utils.get_md5sum(package_data + '0')
144
'Filename': filename,
145
'MD5sum': package_md5
148
get_package_info = self.patch(utils, "get_package_info")
149
get_package_info.return_value = package_info
151
get_file = self.patch(utils, "get_file")
152
get_file.return_value = package_data
155
ValueError, utils.get_package, package,
156
archive, comp, arch, release)
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")
163
get_package = self.patch(utils, "get_package")
164
get_package.return_value = (None, None)
166
utils.get_updates_package(package, archive, comp, arch, release)
168
updates = '%s-updates' % release
172
call(package, archive, comp, arch, release=updates),
173
call(package, archive, comp, arch, release=release)))