Merge lp:~bjornt/landscape-client/remove-test-mixins into lp:~landscape/landscape-client/trunk

Proposed by Björn Tillenius
Status: Merged
Approved by: Free Ekanayaka
Approved revision: 576
Merged at revision: 561
Proposed branch: lp:~bjornt/landscape-client/remove-test-mixins
Merge into: lp:~landscape/landscape-client/trunk
Prerequisite: lp:~bjornt/landscape-client/remove-smart-update
Diff against target: 388 lines (+161/-177)
3 files modified
landscape/package/tests/test_changer.py (+89/-90)
landscape/package/tests/test_reporter.py (+46/-49)
landscape/package/tests/test_skeleton.py (+26/-38)
To merge this branch: bzr merge lp:~bjornt/landscape-client/remove-test-mixins
Reviewer Review Type Date Requested Status
Free Ekanayaka (community) Approve
Alberto Donato (community) Approve
Review via email: mp+105378@code.launchpad.net

Description of the change

Straightforward branch that gets rid of a bunch of mixin test cases and
folds them into the main test cases. The mixins were created during the
smart-to-apt migration to have the same tests being run for both smart
and apt. Now that smart is gone, having them there only makes the tests
harder to understand.

To post a comment you must log in.
Revision history for this message
Alberto Donato (ack) wrote :

Looks good, +1!

#1:
+ # depending on build_skeleton_apt working correctly, which makes
+ # it harder to to TDD for these tests.

typo "to do TDD".

review: Approve
Revision history for this message
Free Ekanayaka (free.ekanayaka) wrote :

Looks good to me, +1!

review: Approve
577. By Björn Tillenius

Typo.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'landscape/package/tests/test_changer.py'
2--- landscape/package/tests/test_changer.py 2012-05-16 08:35:27 +0000
3+++ landscape/package/tests/test_changer.py 2012-05-16 09:05:23 +0000
4@@ -25,7 +25,95 @@
5 from landscape.manager.manager import FAILED
6
7
8-class PackageChangerTestMixin(object):
9+class AptPackageChangerTest(LandscapeTest):
10+
11+ helpers = [AptFacadeHelper, SimpleRepositoryHelper, BrokerServiceHelper]
12+
13+ def setUp(self):
14+
15+ def set_up(ignored):
16+
17+ self.store = PackageStore(self.makeFile())
18+ self.config = PackageChangerConfiguration()
19+ self.config.data_path = self.makeDir()
20+ os.mkdir(self.config.package_directory)
21+ os.mkdir(self.config.binaries_path)
22+ touch_file(self.config.update_stamp_filename)
23+ self.changer = PackageChanger(
24+ self.store, self.facade, self.remote, self.config)
25+ service = self.broker_service
26+ service.message_store.set_accepted_types(["change-packages-result",
27+ "operation-result"])
28+
29+ result = super(AptPackageChangerTest, self).setUp()
30+ return result.addCallback(set_up)
31+
32+ def set_pkg1_installed(self):
33+ """Return the hash of a package that is installed."""
34+ self._add_system_package("foo")
35+ self.facade.reload_channels()
36+ [foo] = self.facade.get_packages_by_name("foo")
37+ return self.facade.get_package_hash(foo)
38+
39+ def set_pkg2_satisfied(self):
40+ """Return the hash of a package that can be installed."""
41+ self._add_package_to_deb_dir(self.repository_dir, "bar")
42+ self.facade.reload_channels()
43+ [bar] = self.facade.get_packages_by_name("bar")
44+ return self.facade.get_package_hash(bar)
45+
46+ def set_pkg1_and_pkg2_satisfied(self):
47+ """Make a package depend on another package.
48+
49+ Return the hashes of the two packages.
50+ """
51+ self._add_package_to_deb_dir(
52+ self.repository_dir, "foo", control_fields={"Depends": "bar"})
53+ self._add_package_to_deb_dir(self.repository_dir, "bar")
54+ self.facade.reload_channels()
55+ [foo] = self.facade.get_packages_by_name("foo")
56+ [bar] = self.facade.get_packages_by_name("bar")
57+ return (
58+ self.facade.get_package_hash(foo),
59+ self.facade.get_package_hash(bar))
60+
61+ def set_pkg2_upgrades_pkg1(self):
62+ """Make it so that one package upgrades another.
63+
64+ Return the hashes of the two packages.
65+ """
66+ self._add_system_package("foo", version="1.0")
67+ self._add_package_to_deb_dir(self.repository_dir, "foo", version="2.0")
68+ self.facade.reload_channels()
69+ foo_1, foo_2 = sorted(self.facade.get_packages_by_name("foo"))
70+ return (
71+ self.facade.get_package_hash(foo_1),
72+ self.facade.get_package_hash(foo_2))
73+
74+ def remove_pkg2(self):
75+ """Remove package name2 from its repository."""
76+ packages_file = os.path.join(self.repository_dir, "Packages")
77+ packages_contents = read_file(packages_file)
78+ packages_contents = "\n\n".join(
79+ [stanza for stanza in packages_contents.split("\n\n")
80+ if "Package: name2" not in stanza])
81+ create_file(packages_file, packages_contents)
82+
83+ def get_transaction_error_message(self):
84+ """Return part of the apt transaction error message."""
85+ return "Unable to correct problems"
86+
87+ def get_binaries_channels(self, binaries_path):
88+ """Return the channels that will be used for the binaries."""
89+ return [{"baseurl": "file://%s" % binaries_path,
90+ "components": "",
91+ "distribution": "./",
92+ "type": "deb"}]
93+
94+ def get_package_name(self, version):
95+ """Return the name of the package."""
96+ return version.package.name
97+
98
99 def disable_clear_channels(self):
100 """Disable clear_channels(), so that it doesn't remove test setup.
101@@ -859,95 +947,6 @@
102 self.assertFalse(os.path.exists(existing_deb_path))
103
104
105-class AptPackageChangerTest(LandscapeTest, PackageChangerTestMixin):
106-
107- helpers = [AptFacadeHelper, SimpleRepositoryHelper, BrokerServiceHelper]
108-
109- def setUp(self):
110-
111- def set_up(ignored):
112-
113- self.store = PackageStore(self.makeFile())
114- self.config = PackageChangerConfiguration()
115- self.config.data_path = self.makeDir()
116- os.mkdir(self.config.package_directory)
117- os.mkdir(self.config.binaries_path)
118- touch_file(self.config.update_stamp_filename)
119- self.changer = PackageChanger(
120- self.store, self.facade, self.remote, self.config)
121- service = self.broker_service
122- service.message_store.set_accepted_types(["change-packages-result",
123- "operation-result"])
124-
125- result = super(AptPackageChangerTest, self).setUp()
126- return result.addCallback(set_up)
127-
128- def set_pkg1_installed(self):
129- """Return the hash of a package that is installed."""
130- self._add_system_package("foo")
131- self.facade.reload_channels()
132- [foo] = self.facade.get_packages_by_name("foo")
133- return self.facade.get_package_hash(foo)
134-
135- def set_pkg2_satisfied(self):
136- """Return the hash of a package that can be installed."""
137- self._add_package_to_deb_dir(self.repository_dir, "bar")
138- self.facade.reload_channels()
139- [bar] = self.facade.get_packages_by_name("bar")
140- return self.facade.get_package_hash(bar)
141-
142- def set_pkg1_and_pkg2_satisfied(self):
143- """Make a package depend on another package.
144-
145- Return the hashes of the two packages.
146- """
147- self._add_package_to_deb_dir(
148- self.repository_dir, "foo", control_fields={"Depends": "bar"})
149- self._add_package_to_deb_dir(self.repository_dir, "bar")
150- self.facade.reload_channels()
151- [foo] = self.facade.get_packages_by_name("foo")
152- [bar] = self.facade.get_packages_by_name("bar")
153- return (
154- self.facade.get_package_hash(foo),
155- self.facade.get_package_hash(bar))
156-
157- def set_pkg2_upgrades_pkg1(self):
158- """Make it so that one package upgrades another.
159-
160- Return the hashes of the two packages.
161- """
162- self._add_system_package("foo", version="1.0")
163- self._add_package_to_deb_dir(self.repository_dir, "foo", version="2.0")
164- self.facade.reload_channels()
165- foo_1, foo_2 = sorted(self.facade.get_packages_by_name("foo"))
166- return (
167- self.facade.get_package_hash(foo_1),
168- self.facade.get_package_hash(foo_2))
169-
170- def remove_pkg2(self):
171- """Remove package name2 from its repository."""
172- packages_file = os.path.join(self.repository_dir, "Packages")
173- packages_contents = read_file(packages_file)
174- packages_contents = "\n\n".join(
175- [stanza for stanza in packages_contents.split("\n\n")
176- if "Package: name2" not in stanza])
177- create_file(packages_file, packages_contents)
178-
179- def get_transaction_error_message(self):
180- """Return part of the apt transaction error message."""
181- return "Unable to correct problems"
182-
183- def get_binaries_channels(self, binaries_path):
184- """Return the channels that will be used for the binaries."""
185- return [{"baseurl": "file://%s" % binaries_path,
186- "components": "",
187- "distribution": "./",
188- "type": "deb"}]
189-
190- def get_package_name(self, version):
191- """Return the name of the package."""
192- return version.package.name
193-
194 def test_binaries_available_in_cache(self):
195 """
196 If binaries are included in the changes-packages message, those
197
198=== modified file 'landscape/package/tests/test_reporter.py'
199--- landscape/package/tests/test_reporter.py 2012-05-10 00:34:13 +0000
200+++ landscape/package/tests/test_reporter.py 2012-05-16 09:05:23 +0000
201@@ -40,7 +40,52 @@
202 self.assertTrue(config.force_apt_update)
203
204
205-class PackageReporterTestMixin(object):
206+class PackageReporterAptTest(LandscapeTest):
207+
208+ helpers = [AptFacadeHelper, SimpleRepositoryHelper, BrokerServiceHelper]
209+
210+ Facade = AptFacade
211+
212+ def setUp(self):
213+
214+ def set_up(ignored):
215+ self.store = PackageStore(self.makeFile())
216+ self.config = PackageReporterConfiguration()
217+ self.reporter = PackageReporter(
218+ self.store, self.facade, self.remote, self.config)
219+ self.config.data_path = self.makeDir()
220+ os.mkdir(self.config.package_directory)
221+
222+ result = super(PackageReporterAptTest, self).setUp()
223+ return result.addCallback(set_up)
224+
225+ def _clear_repository(self):
226+ """Remove all packages from self.repository."""
227+ create_file(self.repository_dir + "/Packages", "")
228+
229+ def set_pkg1_upgradable(self):
230+ """Make it so that package "name1" is considered to be upgradable.
231+
232+ Return the hash of the package that upgrades "name1".
233+ """
234+ self._add_package_to_deb_dir(
235+ self.repository_dir, "name1", version="version2")
236+ self.facade.reload_channels()
237+ name1_upgrade = sorted(self.facade.get_packages_by_name("name1"))[1]
238+ return self.facade.get_package_hash(name1_upgrade)
239+
240+ def set_pkg1_installed(self):
241+ """Make it so that package "name1" is considered installed."""
242+ self._install_deb_file(os.path.join(self.repository_dir, PKGNAME1))
243+
244+ def _make_fake_apt_update(self, out="output", err="error", code=0):
245+ """Create a fake apt-update executable"""
246+ self.reporter.apt_update_filename = self.makeFile(
247+ "#!/bin/sh\n"
248+ "echo -n %s\n"
249+ "echo -n %s >&2\n"
250+ "exit %d" % (out, err, code))
251+ os.chmod(self.reporter.apt_update_filename, 0755)
252
253 def test_set_package_ids_with_all_known(self):
254 self.store.add_hash_id_request(["hash1", "hash2"])
255@@ -1059,54 +1104,6 @@
256 deferred.addCallback(check_result)
257 return deferred
258
259-
260-class PackageReporterAptTest(LandscapeTest, PackageReporterTestMixin):
261-
262- helpers = [AptFacadeHelper, SimpleRepositoryHelper, BrokerServiceHelper]
263-
264- Facade = AptFacade
265-
266- def setUp(self):
267-
268- def set_up(ignored):
269- self.store = PackageStore(self.makeFile())
270- self.config = PackageReporterConfiguration()
271- self.reporter = PackageReporter(
272- self.store, self.facade, self.remote, self.config)
273- self.config.data_path = self.makeDir()
274- os.mkdir(self.config.package_directory)
275-
276- result = super(PackageReporterAptTest, self).setUp()
277- return result.addCallback(set_up)
278-
279- def _clear_repository(self):
280- """Remove all packages from self.repository."""
281- create_file(self.repository_dir + "/Packages", "")
282-
283- def set_pkg1_upgradable(self):
284- """Make it so that package "name1" is considered to be upgradable.
285-
286- Return the hash of the package that upgrades "name1".
287- """
288- self._add_package_to_deb_dir(
289- self.repository_dir, "name1", version="version2")
290- self.facade.reload_channels()
291- name1_upgrade = sorted(self.facade.get_packages_by_name("name1"))[1]
292- return self.facade.get_package_hash(name1_upgrade)
293-
294- def set_pkg1_installed(self):
295- """Make it so that package "name1" is considered installed."""
296- self._install_deb_file(os.path.join(self.repository_dir, PKGNAME1))
297-
298- def _make_fake_apt_update(self, out="output", err="error", code=0):
299- """Create a fake apt-update executable"""
300- self.reporter.apt_update_filename = self.makeFile(
301- "#!/bin/sh\n"
302- "echo -n %s\n"
303- "echo -n %s >&2\n"
304- "exit %d" % (out, err, code))
305- os.chmod(self.reporter.apt_update_filename, 0755)
306-
307 def test_run_apt_update(self):
308 """
309 The L{PackageReporter.run_apt_update} method should run apt-update.
310
311=== modified file 'landscape/package/tests/test_skeleton.py'
312--- landscape/package/tests/test_skeleton.py 2012-05-08 23:21:07 +0000
313+++ landscape/package/tests/test_skeleton.py 2012-05-16 09:05:23 +0000
314@@ -36,16 +36,32 @@
315 PKGDEB_OR_RELATIONS)
316
317
318-class SkeletonTestMixin(object):
319- """Tests for building a skeleton from a package.
320-
321- This class should be mixed in to test different backends, like smart
322- and apt.
323-
324- The main test case classes need to implement C{get_package(name)} to
325- get a package by name, and C{build_skeleton(package, with_info,
326- with_unicode}, which builds the skeleton.
327- """
328+class SkeletonAptTest(LandscapeTest):
329+ """C{PackageSkeleton} tests for apt packages."""
330+
331+ helpers = [AptFacadeHelper, SkeletonTestHelper]
332+
333+ def setUp(self):
334+ super(SkeletonAptTest, self).setUp()
335+ self.facade.add_channel_deb_dir(self.skeleton_repository_dir)
336+ # Don't use reload_channels(), since that causes the test setup
337+ # depending on build_skeleton_apt working correctly, which makes
338+ # it harder to do TDD for these tests.
339+ self.facade._cache.open(None)
340+ self.facade._cache.update(None)
341+ self.facade._cache.open(None)
342+
343+ def get_package(self, name):
344+ """Return the package with the specified name."""
345+ # Don't use get_packages(), since that causes the test setup
346+ # depending on build_skeleton_apt working correctly, which makes
347+ # it harder to to TDD for these tests.
348+ package = self.facade._cache[name]
349+ return package.candidate
350+
351+ def build_skeleton(self, *args, **kwargs):
352+ """Build the skeleton to be tested."""
353+ return build_skeleton_apt(*args, **kwargs)
354
355 def test_build_skeleton(self):
356 """
357@@ -242,31 +258,3 @@
358 (DEB_UPGRADES, "or-relations < 1.0")]
359 self.assertEqual(relations, skeleton.relations)
360 self.assertEqual(HASH_OR_RELATIONS, skeleton.get_hash())
361-
362-
363-class SkeletonAptTest(LandscapeTest, SkeletonTestMixin):
364- """C{PackageSkeleton} tests for apt packages."""
365-
366- helpers = [AptFacadeHelper, SkeletonTestHelper]
367-
368- def setUp(self):
369- super(SkeletonAptTest, self).setUp()
370- self.facade.add_channel_deb_dir(self.skeleton_repository_dir)
371- # Don't use reload_channels(), since that causes the test setup
372- # depending on build_skeleton_apt working correctly, which makes
373- # it harder to to TDD for these tests.
374- self.facade._cache.open(None)
375- self.facade._cache.update(None)
376- self.facade._cache.open(None)
377-
378- def get_package(self, name):
379- """Return the package with the specified name."""
380- # Don't use get_packages(), since that causes the test setup
381- # depending on build_skeleton_apt working correctly, which makes
382- # it harder to to TDD for these tests.
383- package = self.facade._cache[name]
384- return package.candidate
385-
386- def build_skeleton(self, *args, **kwargs):
387- """Build the skeleton to be tested."""
388- return build_skeleton_apt(*args, **kwargs)

Subscribers

People subscribed via source and target branches

to all changes: