Merge lp:~mvo/software-center/size-calculation-via-aptdaemon into lp:software-center
- size-calculation-via-aptdaemon
- Merge into trunk
Proposed by
Michael Vogt
Status: | Merged |
---|---|
Merged at revision: | 3114 |
Proposed branch: | lp:~mvo/software-center/size-calculation-via-aptdaemon |
Merge into: | lp:software-center |
Diff against target: |
391 lines (+127/-105) 6 files modified
softwarecenter/db/pkginfo.py (+10/-3) softwarecenter/db/pkginfo_impl/aptcache.py (+52/-77) softwarecenter/db/pkginfo_impl/packagekit.py (+8/-4) softwarecenter/ui/gtk3/views/appdetailsview.py (+18/-14) tests/test_pkginfo.py (+36/-4) tests/utils.py (+3/-3) |
To merge this branch: | bzr merge lp:~mvo/software-center/size-calculation-via-aptdaemon |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
James Westby (community) | Approve | ||
software-store-developers | Pending | ||
Review via email:
|
Commit message
Description of the change
This moves the size calculation code outside of software-center into aptdaemon. This improves
responsiveness and fixes the issues described in bug #988854.
To post a comment you must log in.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
James Westby (james-w) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'softwarecenter/db/pkginfo.py' | |||
2 | --- softwarecenter/db/pkginfo.py 2012-03-15 03:52:56 +0000 | |||
3 | +++ softwarecenter/db/pkginfo.py 2012-08-20 10:09:26 +0000 | |||
4 | @@ -121,6 +121,10 @@ | |||
5 | 121 | 'cache-broken': (GObject.SIGNAL_RUN_FIRST, | 121 | 'cache-broken': (GObject.SIGNAL_RUN_FIRST, |
6 | 122 | GObject.TYPE_NONE, | 122 | GObject.TYPE_NONE, |
7 | 123 | ()), | 123 | ()), |
8 | 124 | 'query-total-size-on-install-done': ( | ||
9 | 125 | GObject.SIGNAL_RUN_FIRST, | ||
10 | 126 | GObject.TYPE_NONE, | ||
11 | 127 | (int, int)), | ||
12 | 124 | } | 128 | } |
13 | 125 | 129 | ||
14 | 126 | def __getitem__(self, k): | 130 | def __getitem__(self, k): |
15 | @@ -201,15 +205,18 @@ | |||
16 | 201 | which will be removed if the package is installed.""" | 205 | which will be removed if the package is installed.""" |
17 | 202 | return [] | 206 | return [] |
18 | 203 | 207 | ||
20 | 204 | def get_total_size_on_install(self, pkgname, | 208 | def query_total_size_on_install(self, pkgname, |
21 | 205 | addons_install=None, addons_remove=None, | 209 | addons_install=None, addons_remove=None, |
22 | 206 | archive_suite=None): | 210 | archive_suite=None): |
24 | 207 | """ Returns a tuple (download_size, installed_size) | 211 | """ Query for download and installed size |
25 | 208 | with disk size in KB calculated for pkgname installation | 212 | with disk size in KB calculated for pkgname installation |
26 | 209 | plus addons change and a (optional) archive_suite that the | 213 | plus addons change and a (optional) archive_suite that the |
27 | 210 | package comes from | 214 | package comes from |
28 | 215 | |||
29 | 216 | This will emit a "query-total-size-on-install-done" signal | ||
30 | 217 | with the parameters (download_size, required_space_on_disk) | ||
31 | 211 | """ | 218 | """ |
33 | 212 | return (0, 0) | 219 | self.emit("query-total-size-on-install-done", 0, 0) |
34 | 213 | 220 | ||
35 | 214 | def open(self): | 221 | def open(self): |
36 | 215 | """ | 222 | """ |
37 | 216 | 223 | ||
38 | === modified file 'softwarecenter/db/pkginfo_impl/aptcache.py' | |||
39 | --- softwarecenter/db/pkginfo_impl/aptcache.py 2012-08-07 13:15:08 +0000 | |||
40 | +++ softwarecenter/db/pkginfo_impl/aptcache.py 2012-08-20 10:09:26 +0000 | |||
41 | @@ -26,6 +26,9 @@ | |||
42 | 26 | from gi.repository import GObject | 26 | from gi.repository import GObject |
43 | 27 | from gi.repository import Gio | 27 | from gi.repository import Gio |
44 | 28 | 28 | ||
45 | 29 | # we need this to get the size calculation done asyncronously and reliable | ||
46 | 30 | from aptdaemon.client import AptClient | ||
47 | 31 | |||
48 | 29 | from softwarecenter.db.pkginfo import PackageInfo, _Version | 32 | from softwarecenter.db.pkginfo import PackageInfo, _Version |
49 | 30 | from softwarecenter.enums import PkgStates | 33 | from softwarecenter.enums import PkgStates |
50 | 31 | from softwarecenter.utils import ExecutionTime | 34 | from softwarecenter.utils import ExecutionTime |
51 | @@ -135,6 +138,9 @@ | |||
52 | 135 | "changed", self._on_apt_finished_stamp_changed) | 138 | "changed", self._on_apt_finished_stamp_changed) |
53 | 136 | # this is fast, so ok | 139 | # this is fast, so ok |
54 | 137 | self._language_packages = self._read_language_pkgs() | 140 | self._language_packages = self._read_language_pkgs() |
55 | 141 | # query the totalize on install using aptdaemon | ||
56 | 142 | self.aptd_client = AptClient() | ||
57 | 143 | self._aptd_trans = None | ||
58 | 138 | 144 | ||
59 | 139 | @staticmethod | 145 | @staticmethod |
60 | 140 | def version_compare(a, b): | 146 | def version_compare(a, b): |
61 | @@ -569,84 +575,53 @@ | |||
62 | 569 | pkg._pkg, version._cand, archive_suite) | 575 | pkg._pkg, version._cand, archive_suite) |
63 | 570 | return res | 576 | return res |
64 | 571 | 577 | ||
73 | 572 | def get_total_size_on_install(self, pkgname, | 578 | # space calulcation stuff |
74 | 573 | addons_install=None, addons_remove=None, | 579 | def _on_total_size_calculation_done(self, trans, space): |
75 | 574 | archive_suite=None): | 580 | self.emit( |
76 | 575 | pkgs_to_install = [] | 581 | "query-total-size-on-install-done", trans.download, trans.space) |
77 | 576 | pkgs_to_remove = [] | 582 | |
78 | 577 | total_download_size = 0 # in kB | 583 | def _on_trans_simulate_error(self, error): |
79 | 578 | total_install_size = 0 # in kB | 584 | LOG.exception("simulate failed") |
80 | 579 | 585 | ||
81 | 586 | def _on_trans_commit_packages_ready(self, trans): | ||
82 | 587 | trans.connect("space-changed", self._on_total_size_calculation_done) | ||
83 | 588 | try: | ||
84 | 589 | trans.simulate(reply_handler=lambda: True, | ||
85 | 590 | error_handler=self._on_trans_simulate_error) | ||
86 | 591 | except: | ||
87 | 592 | LOG.exception("simulate failed") | ||
88 | 593 | |||
89 | 594 | def query_total_size_on_install(self, pkgname, | ||
90 | 595 | addons_install=[], addons_remove=[], | ||
91 | 596 | archive_suite=""): | ||
92 | 580 | if not pkgname in self._cache: | 597 | if not pkgname in self._cache: |
162 | 581 | return (0, 0) | 598 | self.emit("query-total-size-on-install-done", 0, 0) |
163 | 582 | 599 | ||
164 | 583 | pkg = self._cache[pkgname] | 600 | # ensure the syntax is right |
165 | 584 | version = pkg.installed | 601 | if archive_suite: |
166 | 585 | 602 | pkgname = pkgname + "/" + archive_suite | |
167 | 586 | all_install = [] | 603 | |
168 | 587 | if addons_install is not None: | 604 | # and simulate the install/remove via aptdaemon |
169 | 588 | all_install += addons_install | 605 | install = [pkgname] + addons_install |
170 | 589 | 606 | remove = addons_remove | |
171 | 590 | if version is None: | 607 | reinstall = purge = upgrade = downgrade = [] |
172 | 591 | # its important that its the first pkg as the depcache will | 608 | |
173 | 592 | # get cleared for each pkg and that will means that the | 609 | if self._aptd_trans: |
174 | 593 | # set_candidate_release is lost again | 610 | self._aptd_trans.cancel() |
175 | 594 | all_install.append(pkgname) | 611 | self._aptd_trans = None |
176 | 595 | 612 | ||
177 | 596 | for p in all_install: | 613 | # do this async |
178 | 597 | # ensure that the archive_suite is set if needed, this needs to | 614 | try: |
179 | 598 | # be in the loop as the cache is cleared in each loop iteration | 615 | self.aptd_client.commit_packages( |
180 | 599 | if archive_suite: | 616 | install, reinstall, remove, purge, upgrade, downgrade, |
181 | 600 | self._set_candidate_release(pkg, archive_suite) | 617 | # wait |
182 | 601 | # now get the right version | 618 | False, |
183 | 602 | version = self._cache[p].candidate | 619 | # reply and error handlers |
184 | 603 | # this can happen on e.g. deb packages that are not in the cache | 620 | self._on_trans_commit_packages_ready, |
185 | 604 | # testcase: software-center google-chrome-stable_current_amd64.deb | 621 | self._on_trans_simulate_error) |
186 | 605 | if not version: | 622 | except: |
187 | 606 | continue | 623 | LOG.exception( |
188 | 607 | pkgs_to_install.append(version) | 624 | "getting commit_packages trans failed for '%s'" % pkgname) |
120 | 608 | # now do it | ||
121 | 609 | deps_inst = self._try_install_and_get_all_deps_installed( | ||
122 | 610 | self._cache[p]) | ||
123 | 611 | for dep in deps_inst: | ||
124 | 612 | if self._cache[dep].installed is None: | ||
125 | 613 | dep_version = self._cache[dep].candidate | ||
126 | 614 | pkgs_to_install.append(dep_version) | ||
127 | 615 | deps_remove = self._try_install_and_get_all_deps_removed( | ||
128 | 616 | self._cache[p]) | ||
129 | 617 | for dep in deps_remove: | ||
130 | 618 | if self._cache[dep].is_installed: | ||
131 | 619 | dep_version = self._cache[dep].installed | ||
132 | 620 | pkgs_to_remove.append(dep_version) | ||
133 | 621 | |||
134 | 622 | all_remove = [] if addons_remove is None else addons_remove | ||
135 | 623 | for p in all_remove: | ||
136 | 624 | version = self._cache[p].installed | ||
137 | 625 | pkgs_to_remove.append(version) | ||
138 | 626 | deps_inst = self._try_install_and_get_all_deps_installed( | ||
139 | 627 | self._cache[p]) | ||
140 | 628 | for dep in deps_inst: | ||
141 | 629 | if self._cache[dep].installed is None: | ||
142 | 630 | version = self._cache[dep].candidate | ||
143 | 631 | pkgs_to_install.append(version) | ||
144 | 632 | deps_remove = self._try_install_and_get_all_deps_removed( | ||
145 | 633 | self._cache[p]) | ||
146 | 634 | for dep in deps_remove: | ||
147 | 635 | if self._cache[dep].installed is not None: | ||
148 | 636 | version = self._cache[dep].installed | ||
149 | 637 | pkgs_to_remove.append(version) | ||
150 | 638 | |||
151 | 639 | pkgs_to_install = list(set(pkgs_to_install)) | ||
152 | 640 | pkgs_to_remove = list(set(pkgs_to_remove)) | ||
153 | 641 | |||
154 | 642 | for pkg in pkgs_to_install: | ||
155 | 643 | if not pkg_downloaded(pkg) and not pkg.package.installed: | ||
156 | 644 | total_download_size += pkg.size | ||
157 | 645 | total_install_size += pkg.installed_size | ||
158 | 646 | for pkg in pkgs_to_remove: | ||
159 | 647 | total_install_size -= pkg.installed_size | ||
160 | 648 | |||
161 | 649 | return (total_download_size, total_install_size) | ||
189 | 650 | 625 | ||
190 | 651 | def get_all_deps_upgrading(self, pkg): | 626 | def get_all_deps_upgrading(self, pkg): |
191 | 652 | # note: this seems not to be used anywhere | 627 | # note: this seems not to be used anywhere |
192 | 653 | 628 | ||
193 | === modified file 'softwarecenter/db/pkginfo_impl/packagekit.py' | |||
194 | --- softwarecenter/db/pkginfo_impl/packagekit.py 2012-03-07 20:08:53 +0000 | |||
195 | +++ softwarecenter/db/pkginfo_impl/packagekit.py 2012-08-20 10:09:26 +0000 | |||
196 | @@ -264,20 +264,24 @@ | |||
197 | 264 | if (p.get_name() != pkg.name) | 264 | if (p.get_name() != pkg.name) |
198 | 265 | and p.get_info() == packagekit.InfoEnum.INSTALLED] | 265 | and p.get_info() == packagekit.InfoEnum.INSTALLED] |
199 | 266 | 266 | ||
201 | 267 | def get_total_size_on_install(self, pkgname, | 267 | def query_total_size_on_install(self, pkgname, |
202 | 268 | addons_install=None, addons_remove=None, | 268 | addons_install=None, addons_remove=None, |
203 | 269 | archive_suite=None): | 269 | archive_suite=None): |
205 | 270 | """ Returns a tuple (download_size, installed_size) | 270 | """ emit query-total-size-on-install-done signal |
206 | 271 | with disk size in KB calculated for pkgname installation | 271 | with disk size in KB calculated for pkgname installation |
207 | 272 | plus addons change. | 272 | plus addons change. |
208 | 273 | """ | 273 | """ |
209 | 274 | # FIXME: support archive_suite here too | 274 | # FIXME: support archive_suite here too |
210 | 275 | 275 | ||
211 | 276 | # FIXME: PackageKit reports only one size at a time | 276 | # FIXME: PackageKit reports only one size at a time |
212 | 277 | download_size = 0 | ||
213 | 278 | install_size = 0 | ||
214 | 277 | if self.is_installed(pkgname): | 279 | if self.is_installed(pkgname): |
216 | 278 | return (0, self.get_size(pkgname)) | 280 | install_size = self.get_size(pkgname) |
217 | 279 | else: | 281 | else: |
219 | 280 | return (self.get_size(pkgname), 0) | 282 | download_size = self.get_size(pkgname) |
220 | 283 | self.emit( | ||
221 | 284 | "query-total-size-on-install-done", download_size, install_size) | ||
222 | 281 | 285 | ||
223 | 282 | @property | 286 | @property |
224 | 283 | def ready(self): | 287 | def ready(self): |
225 | 284 | 288 | ||
226 | === modified file 'softwarecenter/ui/gtk3/views/appdetailsview.py' | |||
227 | --- softwarecenter/ui/gtk3/views/appdetailsview.py 2012-08-17 08:56:26 +0000 | |||
228 | +++ softwarecenter/ui/gtk3/views/appdetailsview.py 2012-08-20 10:09:26 +0000 | |||
229 | @@ -762,8 +762,7 @@ | |||
230 | 762 | if addon in self.addons_to_install: | 762 | if addon in self.addons_to_install: |
231 | 763 | self.addons_to_install.remove(addon) | 763 | self.addons_to_install.remove(addon) |
232 | 764 | self.status_bar.configure() | 764 | self.status_bar.configure() |
235 | 765 | GObject.idle_add(self.view.update_totalsize, | 765 | self.view.update_totalsize() |
234 | 766 | priority=GObject.PRIORITY_LOW) | ||
236 | 767 | 766 | ||
237 | 768 | def configure(self, pkgname, update_addons=True): | 767 | def configure(self, pkgname, update_addons=True): |
238 | 769 | self.addons_to_install = [] | 768 | self.addons_to_install = [] |
239 | @@ -780,8 +779,7 @@ | |||
240 | 780 | self.addons_to_install = [] | 779 | self.addons_to_install = [] |
241 | 781 | self.addons_to_remove = [] | 780 | self.addons_to_remove = [] |
242 | 782 | self.configure(self.view.app.pkgname) | 781 | self.configure(self.view.app.pkgname) |
245 | 783 | GObject.idle_add(self.view.update_totalsize, | 782 | self.view.update_totalsize() |
244 | 784 | priority=GObject.PRIORITY_LOW) | ||
246 | 785 | 783 | ||
247 | 786 | 784 | ||
248 | 787 | _asset_cache = {} | 785 | _asset_cache = {} |
249 | @@ -814,6 +812,8 @@ | |||
250 | 814 | self.distro = distro | 812 | self.distro = distro |
251 | 815 | self.icons = icons | 813 | self.icons = icons |
252 | 816 | self.cache = cache | 814 | self.cache = cache |
253 | 815 | self.cache.connect("query-total-size-on-install-done", | ||
254 | 816 | self._on_query_total_size_on_install_done) | ||
255 | 817 | self.backend = get_install_backend() | 817 | self.backend = get_install_backend() |
256 | 818 | self.cache.connect("cache-ready", self._on_cache_ready) | 818 | self.cache.connect("cache-ready", self._on_cache_ready) |
257 | 819 | self.connect("destroy", self._on_destroy) | 819 | self.connect("destroy", self._on_destroy) |
258 | @@ -1496,8 +1496,7 @@ | |||
259 | 1496 | self.addons_manager.configure(app_details.pkgname) | 1496 | self.addons_manager.configure(app_details.pkgname) |
260 | 1497 | 1497 | ||
261 | 1498 | # Update total size label | 1498 | # Update total size label |
264 | 1499 | self.totalsize_info.set_value(_("Calculating...")) | 1499 | self.update_totalsize() |
263 | 1500 | GObject.timeout_add(500, self.update_totalsize) | ||
265 | 1501 | 1500 | ||
266 | 1502 | # Update addons state bar | 1501 | # Update addons state bar |
267 | 1503 | self.addons_statusbar.configure() | 1502 | self.addons_statusbar.configure() |
268 | @@ -1545,9 +1544,7 @@ | |||
269 | 1545 | self.addon_view.hide() | 1544 | self.addon_view.hide() |
270 | 1546 | if self.addon_view.get_parent(): | 1545 | if self.addon_view.get_parent(): |
271 | 1547 | self.info_vb.remove(self.addon_view) | 1546 | self.info_vb.remove(self.addon_view) |
275 | 1548 | self.totalsize_info.set_value(_("Calculating...")) | 1547 | self.update_totalsize() |
273 | 1549 | GObject.idle_add(self.update_totalsize, | ||
274 | 1550 | priority=GObject.PRIORITY_LOW) | ||
276 | 1551 | self._update_recommendations(app_details.pkgname) | 1548 | self._update_recommendations(app_details.pkgname) |
277 | 1552 | self._update_reviews(app_details) | 1549 | self._update_reviews(app_details) |
278 | 1553 | 1550 | ||
279 | @@ -2004,18 +2001,25 @@ | |||
280 | 2004 | if not self.totalsize_info.get_property('visible'): | 2001 | if not self.totalsize_info.get_property('visible'): |
281 | 2005 | return False | 2002 | return False |
282 | 2006 | 2003 | ||
283 | 2004 | self.totalsize_info.set_value(_("Calculating...")) | ||
284 | 2005 | |||
285 | 2007 | while Gtk.events_pending(): | 2006 | while Gtk.events_pending(): |
286 | 2008 | Gtk.main_iteration() | 2007 | Gtk.main_iteration() |
287 | 2009 | 2008 | ||
291 | 2010 | label_string = "" | 2009 | self.cache.query_total_size_on_install( |
289 | 2011 | |||
290 | 2012 | res = self.cache.get_total_size_on_install( | ||
292 | 2013 | self.app_details.pkgname, | 2010 | self.app_details.pkgname, |
293 | 2014 | self.addons_manager.addons_to_install, | 2011 | self.addons_manager.addons_to_install, |
294 | 2015 | self.addons_manager.addons_to_remove, | 2012 | self.addons_manager.addons_to_remove, |
295 | 2016 | self.app.archive_suite) | 2013 | self.app.archive_suite) |
298 | 2017 | total_download_size, total_install_size = res | 2014 | |
299 | 2018 | if res == (0, 0) and isinstance(self.app, DebFileApplication): | 2015 | def _on_query_total_size_on_install_done(self, |
300 | 2016 | pkginfo, | ||
301 | 2017 | total_download_size, | ||
302 | 2018 | total_install_size): | ||
303 | 2019 | label_string = "" | ||
304 | 2020 | if (total_download_size == 0 and | ||
305 | 2021 | total_install_size == 0 and | ||
306 | 2022 | isinstance(self.app, DebFileApplication)): | ||
307 | 2019 | total_install_size = self.app_details.installed_size | 2023 | total_install_size = self.app_details.installed_size |
308 | 2020 | if total_download_size > 0: | 2024 | if total_download_size > 0: |
309 | 2021 | download_size = GLib.format_size(total_download_size) | 2025 | download_size = GLib.format_size(total_download_size) |
310 | 2022 | 2026 | ||
311 | === modified file 'tests/test_pkginfo.py' | |||
312 | --- tests/test_pkginfo.py 2012-05-30 18:39:55 +0000 | |||
313 | +++ tests/test_pkginfo.py 2012-08-20 10:09:26 +0000 | |||
314 | @@ -6,6 +6,7 @@ | |||
315 | 6 | from mock import patch | 6 | from mock import patch |
316 | 7 | 7 | ||
317 | 8 | from tests.utils import ( | 8 | from tests.utils import ( |
318 | 9 | get_test_pkg_info, | ||
319 | 9 | setup_test_env, | 10 | setup_test_env, |
320 | 10 | ) | 11 | ) |
321 | 11 | setup_test_env() | 12 | setup_test_env() |
322 | @@ -35,7 +36,36 @@ | |||
323 | 35 | self.cache = apt.Cache(memonly=True) | 36 | self.cache = apt.Cache(memonly=True) |
324 | 36 | 37 | ||
325 | 37 | def test_get_total_size(self): | 38 | def test_get_total_size(self): |
327 | 38 | # get a cache | 39 | def _on_query_total_size_on_install_done(pkginfo, download, space): |
328 | 40 | self.need_download = download | ||
329 | 41 | self.need_space = space | ||
330 | 42 | loop.quit() | ||
331 | 43 | TEST_PKG = "casper" | ||
332 | 44 | ADDONS_TO_INSTALL = [ "lupin-casper" ] | ||
333 | 45 | ADDONS_TO_REMOVE = [] | ||
334 | 46 | loop = GObject.MainLoop(GObject.main_context_default()) | ||
335 | 47 | cache = get_test_pkg_info() | ||
336 | 48 | cache.connect( | ||
337 | 49 | "query-total-size-on-install-done", | ||
338 | 50 | _on_query_total_size_on_install_done) | ||
339 | 51 | cache.query_total_size_on_install( | ||
340 | 52 | TEST_PKG, ADDONS_TO_INSTALL, ADDONS_TO_REMOVE) | ||
341 | 53 | loop.run() | ||
342 | 54 | # work out the numbers that we at least need to get (this will | ||
343 | 55 | # not include dependencies so it is probably lower) | ||
344 | 56 | need_at_least_download = ( | ||
345 | 57 | cache[TEST_PKG].candidate.size + | ||
346 | 58 | sum([cache[pkg].candidate.size for pkg in ADDONS_TO_INSTALL])) | ||
347 | 59 | need_at_least_installed = ( | ||
348 | 60 | cache[TEST_PKG].candidate.installed_size + | ||
349 | 61 | sum([cache[pkg].candidate.installed_size for pkg in ADDONS_TO_INSTALL])) | ||
350 | 62 | self.assertTrue(self.need_download >= need_at_least_download) | ||
351 | 63 | self.assertTrue(self.need_space >= need_at_least_installed) | ||
352 | 64 | del self.need_download | ||
353 | 65 | del self.need_space | ||
354 | 66 | |||
355 | 67 | def test_get_total_size_with_mock(self): | ||
356 | 68 | # get a cache | ||
357 | 39 | cache = get_pkg_info() | 69 | cache = get_pkg_info() |
358 | 40 | cache.open() | 70 | cache.open() |
359 | 41 | # pick first uninstalled pkg | 71 | # pick first uninstalled pkg |
360 | @@ -45,11 +75,13 @@ | |||
361 | 45 | # prepare args | 75 | # prepare args |
362 | 46 | addons_to_install = addons_to_remove = [] | 76 | addons_to_install = addons_to_remove = [] |
363 | 47 | archive_suite = "foo" | 77 | archive_suite = "foo" |
366 | 48 | with patch.object(cache, "_set_candidate_release") as f_mock: | 78 | with patch.object(cache.aptd_client, "commit_packages") as f_mock: |
367 | 49 | cache.get_total_size_on_install( | 79 | cache.query_total_size_on_install( |
368 | 50 | pkg.name, addons_to_install, addons_to_remove, archive_suite) | 80 | pkg.name, addons_to_install, addons_to_remove, archive_suite) |
369 | 51 | # ensure it got called with the right arguments | 81 | # ensure it got called with the right arguments |
371 | 52 | f_mock.assert_called_with(pkg, archive_suite) | 82 | args, kwargs = f_mock.call_args |
372 | 83 | to_install = args[0] | ||
373 | 84 | self.assertTrue(to_install[0].endswith("/%s" % archive_suite)) | ||
374 | 53 | 85 | ||
375 | 54 | 86 | ||
376 | 55 | if __name__ == "__main__": | 87 | if __name__ == "__main__": |
377 | 56 | 88 | ||
378 | === modified file 'tests/utils.py' | |||
379 | --- tests/utils.py 2012-05-31 12:50:01 +0000 | |||
380 | +++ tests/utils.py 2012-08-20 10:09:26 +0000 | |||
381 | @@ -395,7 +395,7 @@ | |||
382 | 395 | """Return (recommended, suggested) addons for 'pkgname'.""" | 395 | """Return (recommended, suggested) addons for 'pkgname'.""" |
383 | 396 | return ([], []) | 396 | return ([], []) |
384 | 397 | 397 | ||
386 | 398 | def get_total_size_on_install(self, pkgname, addons_to_install, | 398 | def query_total_size_on_install(self, pkgname, addons_to_install, |
387 | 399 | addons_to_remove, archive_suite): | 399 | addons_to_remove, archive_suite): |
390 | 400 | """Return a fake (total_download_size, total_install_size) result.""" | 400 | """Emit a fake signal "query-total-size-on-install-done" """ |
391 | 401 | return (0, 0) | 401 | self.emit("query-total-size-on-install-done", (0, 0)) |