Merge lp:~mandel/ubuntuone-windows-installer/auto-update-python-only into lp:ubuntuone-windows-installer
- auto-update-python-only
- Merge into trunk
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Roberto Alsina | ||||
Approved revision: | 77 | ||||
Merged at revision: | 73 | ||||
Proposed branch: | lp:~mandel/ubuntuone-windows-installer/auto-update-python-only | ||||
Merge into: | lp:ubuntuone-windows-installer | ||||
Diff against target: |
415 lines (+241/-7) 7 files modified
ubuntuone_installer/gui/qt/gui.py (+11/-0) ubuntuone_installer/gui/qt/main/tests/test_windows.py (+19/-2) ubuntuone_installer/gui/qt/main/windows.py (+29/-5) ubuntuone_installer/gui/qt/tests/test_gui.py (+49/-0) ubuntuone_installer/gui/qt/utils/__init__.py (+4/-0) ubuntuone_installer/gui/qt/utils/tests/test_windows.py (+85/-0) ubuntuone_installer/gui/qt/utils/windows.py (+44/-0) |
||||
To merge this branch: | bzr merge lp:~mandel/ubuntuone-windows-installer/auto-update-python-only | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Roberto Alsina (community) | Approve | ||
Diego Sarmentero (community) | Approve | ||
Review via email: mp+76047@code.launchpad.net |
Commit message
Partial fix for lp: 845662
Provides the code that perform a call to the auto-update process that will check for updates and will perform them if the user agrees to do so.
Description of the change
Provides the code that perform a call to the auto-update process that will check for updates and will perform them if the user agrees to do so.
- 72. By Manuel de la Peña
-
Remove named parameter comming from a smart-ass diff.
- 73. By Manuel de la Peña
-
Fixed the tests so that they take into account the new update method.
Roberto Alsina (ralsina) wrote : | # |
C:\Users\
Traceback (most recent call last):
File "ubuntuone-
File "ubuntuone_
File "twisted\
TypeError: check_credentials() takes at most 4 arguments (5 given)
- 74. By Manuel de la Peña
-
Pass the correct number of parameters.
Roberto Alsina (ralsina) wrote : | # |
2011-09-20 09:51:56,575 - ubuntuone.
Unhandled error in Deferred:
Traceback (most recent call last):
File "twisted\
File "twisted\
File "twisted\
File "twisted\
--- <exception caught here> ---
File "twisted\
File "twisted\
File "ubuntuone_
File "twisted\
File "twisted\
File "ubuntuone_
File "twisted\
File "ubuntuone_
File "ubuntuone_
exceptions.
- 75. By Manuel de la Peña
-
Added missing var.
Roberto Alsina (ralsina) wrote : | # |
Unhandled error in Deferred:
Traceback (most recent call last):
File "twisted\
File "twisted\
File "twisted\
File "twisted\
--- <exception caught here> ---
File "twisted\
File "twisted\
File "ubuntuone_
File "twisted\
File "ubuntuone_
File "ubuntuone_
File "twisted\
twisted.
- 76. By Manuel de la Peña
-
Merged with trunk.
- 77. By Manuel de la Peña
-
Removed the stop_fn since there is not need because the installer takes care of the situation in which the files are used.
Roberto Alsina (ralsina) : | # |
Preview Diff
1 | === modified file 'ubuntuone_installer/gui/qt/gui.py' |
2 | --- ubuntuone_installer/gui/qt/gui.py 2011-09-19 15:41:40 +0000 |
3 | +++ ubuntuone_installer/gui/qt/gui.py 2011-09-22 19:45:30 +0000 |
4 | @@ -84,12 +84,23 @@ |
5 | CREDENTIALS_ERROR = _('Application will close.\n\n%r') |
6 | SKIP_TOUR = _("Skip tour, go to Dashboard") |
7 | START_SETUP = _("Start setup") |
8 | +UPDATE_TITLE = _("Updates are available") |
9 | +UPDATE_SOFTWARE = _("There is a new version available. Do you want perform an upgrade?") |
10 | # Invalid name logger |
11 | # pylint: disable=C0103 |
12 | logger = setup_logging('qt.gui') |
13 | # pylint: enable=C0103 |
14 | |
15 | |
16 | +def user_wants_to_update(): |
17 | + """Ask the user if he really wants to update the software.""" |
18 | + result = QtGui.QMessageBox.question(None, UPDATE_TITLE, UPDATE_SOFTWARE, |
19 | + QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) |
20 | + if result == QtGui.QMessageBox.Yes: |
21 | + return True |
22 | + return False |
23 | + |
24 | + |
25 | class LicensePage(SSOWizardPage): |
26 | """Wizard Page that displays the license info and links to the GPL.""" |
27 | |
28 | |
29 | === modified file 'ubuntuone_installer/gui/qt/main/tests/test_windows.py' |
30 | --- ubuntuone_installer/gui/qt/main/tests/test_windows.py 2011-09-19 23:00:32 +0000 |
31 | +++ ubuntuone_installer/gui/qt/main/tests/test_windows.py 2011-09-22 19:45:30 +0000 |
32 | @@ -59,22 +59,37 @@ |
33 | """Fake Logger.""" |
34 | |
35 | error_args = None |
36 | + debug_args = None |
37 | + info_args = None |
38 | |
39 | def error(self, *args, **kwargs): |
40 | """Save the error.""" |
41 | self.error_args = (args, kwargs) |
42 | |
43 | + def debug(self, *args, **kwargs): |
44 | + """Save the debug.""" |
45 | + self.debug_args = (args, kwargs) |
46 | + |
47 | + def info(self, *args, **kwargs): |
48 | + """Save the info.""" |
49 | + self.info_args = (args, kwargs) |
50 | + |
51 | |
52 | class CredsFailureMainTestCase(TestCase): |
53 | |
54 | """Test the qt main window.""" |
55 | |
56 | stopped = False |
57 | + updates_checked = False |
58 | |
59 | def stop(self): |
60 | """A fake stop.""" |
61 | self.stopped = True |
62 | |
63 | + def check_updates(self, gui, logger): |
64 | + """A fake check updates.""" |
65 | + self.updates_checked = True |
66 | + |
67 | @defer.inlineCallbacks |
68 | def test_failure(self): |
69 | """Credential errors should display a critical message.""" |
70 | @@ -116,6 +131,7 @@ |
71 | logger = FakeLogger() |
72 | self.patch(utils, 'start_control_panel', self._set_called) |
73 | self.patch(windows, 'stop', self.stop) |
74 | + self.patch(windows, 'check_updates', self.check_updates) |
75 | self.stopped = False |
76 | yield windows.check_credentials( |
77 | FakeCredentialsManagementTool, |
78 | @@ -126,6 +142,7 @@ |
79 | self.assertEqual(self._called, ((), {'with_icon': False})) |
80 | # Should stop the app |
81 | self.assertTrue(self.stopped) |
82 | + self.assertTrue(self.updates_checked) |
83 | |
84 | @defer.inlineCallbacks |
85 | def test_without_installed_flag(self): |
86 | @@ -136,7 +153,7 @@ |
87 | FakeCredentialsManagementTool, |
88 | gui, logger) |
89 | self.assertEqual(self._called, (('Something not false', |
90 | - gui, False), {})) |
91 | + gui, False, logger), {})) |
92 | |
93 | @defer.inlineCallbacks |
94 | def test_with_installed_flag(self): |
95 | @@ -147,4 +164,4 @@ |
96 | FakeCredentialsManagementTool, |
97 | gui, logger, installer=True) |
98 | self.assertEqual(self._called, (('Something not false', |
99 | - gui, True), {})) |
100 | + gui, True, logger), {})) |
101 | |
102 | === modified file 'ubuntuone_installer/gui/qt/main/windows.py' |
103 | --- ubuntuone_installer/gui/qt/main/windows.py 2011-09-19 23:00:32 +0000 |
104 | +++ ubuntuone_installer/gui/qt/main/windows.py 2011-09-22 19:45:30 +0000 |
105 | @@ -29,6 +29,7 @@ |
106 | # pylint: disable=W0611 |
107 | from ubuntuone_installer.gui.qt.ui import images_rc |
108 | # pylint: enable=W0611 |
109 | +from ubuntuone_installer.gui.qt import utils |
110 | |
111 | |
112 | def stop(*args): |
113 | @@ -43,14 +44,20 @@ |
114 | 'Error while getting the credentials: %r', exc) |
115 | stop() |
116 | |
117 | - |
118 | -def success_cb(creds, gui, installing): |
119 | +@defer.inlineCallbacks |
120 | +def success_cb(creds, gui, installing, logger): |
121 | """Handle credentials success.""" |
122 | + logger.debug('Got back from sso.') |
123 | if creds: # Have credentials already |
124 | - from ubuntuone_installer.gui.qt import utils |
125 | + logger.debug('Already got credentials.') |
126 | + logger.info('Starting control panel.') |
127 | utils.start_control_panel(with_icon=False) |
128 | + logger.info('Checking updates.') |
129 | + yield check_updates(gui, logger) |
130 | + logger.info('Stopping.') |
131 | stop() |
132 | else: # No credentials |
133 | + logger.debug('Did got connections.') |
134 | window = gui.MainWindow(close_callback=stop, installing=installing) |
135 | # Set Application Style Sheet |
136 | app = QtGui.QApplication.instance() |
137 | @@ -65,7 +72,8 @@ |
138 | |
139 | |
140 | @defer.inlineCallbacks |
141 | -def check_credentials(credentials_tool, gui, logger, installer=False): |
142 | +def check_credentials(credentials_tool, gui, logger, |
143 | + installer=False): |
144 | """Check credentials and either start u1cp or show the wizard.""" |
145 | credtool = credentials_tool() |
146 | # pylint: disable=W0703 |
147 | @@ -74,7 +82,23 @@ |
148 | except Exception, exc: |
149 | error_cb(exc, logger) |
150 | else: |
151 | - success_cb(creds, gui, installer) |
152 | + yield success_cb(creds, gui, installer, logger) |
153 | + |
154 | +@defer.inlineCallbacks |
155 | +def check_updates(gui, logger): |
156 | + """Check for updates.""" |
157 | + logger.info('Checking for updates.') |
158 | + # the idea is simple, check if there are updates, ask user if we perform |
159 | + # the update and continue. |
160 | + are_updates_present = yield utils.are_updates_present(logger) |
161 | + logger.debug('Updates present: %r', are_updates_present) |
162 | + if are_updates_present: |
163 | + logger.info('Updates are present.') |
164 | + if gui.user_wants_to_update(): |
165 | + logger.info('Performing auto-update in diff process.') |
166 | + utils.perform_update() |
167 | + else: |
168 | + logger.info('No updates are present.') |
169 | |
170 | |
171 | def main(installing=False): |
172 | |
173 | === modified file 'ubuntuone_installer/gui/qt/tests/test_gui.py' |
174 | --- ubuntuone_installer/gui/qt/tests/test_gui.py 2011-09-21 18:24:39 +0000 |
175 | +++ ubuntuone_installer/gui/qt/tests/test_gui.py 2011-09-22 19:45:30 +0000 |
176 | @@ -22,6 +22,7 @@ |
177 | from PyQt4 import QtGui, QtCore |
178 | from ubuntuone.controlpanel.gui import qt |
179 | from ubuntuone.platform.credentials import APP_NAME |
180 | +from twisted.internet import defer |
181 | |
182 | from ubuntuone_installer.gui import NEXT |
183 | from ubuntuone_installer.gui.qt import gui, forgotten, utils |
184 | @@ -662,3 +663,51 @@ |
185 | [QtGui.QWizard.Stretch, |
186 | QtGui.QWizard.FinishButton, |
187 | QtGui.QWizard.NextButton]) |
188 | + |
189 | +class UpgradeQuestion(BaseTestCase): |
190 | + """Test the dialog that ask the user if he wants to upgrade.""" |
191 | + |
192 | + @defer.inlineCallbacks |
193 | + def setUp(self): |
194 | + """Set the tests.""" |
195 | + yield super(UpgradeQuestion, self).setUp() |
196 | + self.answer = 0 |
197 | + self.parent = None |
198 | + self.title = None |
199 | + self.text = None |
200 | + self.yes_button = None |
201 | + self.no_button = None |
202 | + |
203 | + def fake_question(parent, title, text, yes_button, |
204 | + no_button): |
205 | + """Fake asking a question.""" |
206 | + self.parent = parent |
207 | + self.title = title |
208 | + self.text = text |
209 | + self.yes_button = yes_button |
210 | + self.no_button = no_button |
211 | + return self.answer |
212 | + |
213 | + self.patch(gui.QtGui.QMessageBox, 'question', fake_question) |
214 | + |
215 | + def user_wants_to_update_true(self): |
216 | + """Test the question.""" |
217 | + self.answer = gui.QtGui.QMessageBox.Yes |
218 | + self.assertTrue(gui.user_wants_to_update(), 'User wants to update.') |
219 | + # lets assert the parameters |
220 | + self.assertTrue(None, self.parent) |
221 | + self.assertTrue(self.title, gui.UPDATE_TITLE) |
222 | + self.assertTrue(self.text, gui.UPDATE_SOFTWARE) |
223 | + self.assertTrue(self.yes_button, gui.QtGui.QMessageBox.Yes) |
224 | + self.assertTrue(self.no_button, gui.QtGui.QMessageBox.No) |
225 | + |
226 | + def user_wants_to_update_false(self): |
227 | + """Test the question.""" |
228 | + self.answer = gui.QtGui.QMessageBox.No |
229 | + self.assertFalse(gui.user_wants_to_update(), 'User DOES NOT want to update.') |
230 | + # lets assert the parameters |
231 | + self.assertTrue(None, self.parent) |
232 | + self.assertTrue(self.title, gui.UPDATE_TITLE) |
233 | + self.assertTrue(self.text, gui.UPDATE_SOFTWARE) |
234 | + self.assertTrue(self.yes_button, gui.QtGui.QMessageBox.Yes) |
235 | + self.assertTrue(self.no_button, gui.QtGui.QMessageBox.No) |
236 | |
237 | === modified file 'ubuntuone_installer/gui/qt/utils/__init__.py' |
238 | --- ubuntuone_installer/gui/qt/utils/__init__.py 2011-09-01 13:52:35 +0000 |
239 | +++ ubuntuone_installer/gui/qt/utils/__init__.py 2011-09-22 19:45:30 +0000 |
240 | @@ -28,9 +28,13 @@ |
241 | start_control_panel = windows.start_control_panel |
242 | add_syncdaemon_to_autostart = windows.add_syncdaemon_to_autostart |
243 | default_folders = windows.default_folders |
244 | + are_updates_present = windows.are_updates_present |
245 | + perform_update = windows.perform_update |
246 | else: |
247 | from ubuntuone_installer.gui.qt.utils import linux |
248 | uninstall_application = linux.uninstall_application |
249 | start_control_panel = linux.start_control_panel |
250 | add_syncdaemon_to_autostart = linux.add_syncdaemon_to_autostart |
251 | default_folders = linux.default_folders |
252 | + are_updates_present = lambda *args, **kwargs: False |
253 | + perform_update = lambda *args, **kwargs: None |
254 | |
255 | === modified file 'ubuntuone_installer/gui/qt/utils/tests/test_windows.py' |
256 | --- ubuntuone_installer/gui/qt/utils/tests/test_windows.py 2011-09-19 23:01:24 +0000 |
257 | +++ ubuntuone_installer/gui/qt/utils/tests/test_windows.py 2011-09-22 19:45:30 +0000 |
258 | @@ -27,6 +27,8 @@ |
259 | import win32api |
260 | # pylint: enable=F0401 |
261 | |
262 | +from twisted.internet import defer |
263 | + |
264 | from ubuntuone_installer.gui.qt import utils |
265 | from ubuntuone_installer.gui.qt.tests import BaseTestCase |
266 | |
267 | @@ -229,3 +231,86 @@ |
268 | pictures = buf.value |
269 | expected = [docs, music, pictures] |
270 | self.assertEqual(sorted(folders), sorted(expected)) |
271 | + |
272 | + |
273 | +class FakeLogger(object): |
274 | + """A Fake logging object.""" |
275 | + |
276 | + def __init__(self): |
277 | + """Create a new instance.""" |
278 | + self.called_methods = [] |
279 | + |
280 | + def info(self, message, *args, **kwargs): |
281 | + """Set an info log message.""" |
282 | + self.called_methods.append(('info', message, args, kwargs)) |
283 | + |
284 | + def debug(self, message, *args, **kwargs): |
285 | + """Set a debug log message.""" |
286 | + self.called_methods.append(('debug', message, args, kwargs)) |
287 | + |
288 | + |
289 | +class AutoupdaterTestCase(BaseTestCase): |
290 | + """Test the code that is used for the auto update process.""" |
291 | + |
292 | + @defer.inlineCallbacks |
293 | + def setUp(self): |
294 | + """Prepare for the diff tests.""" |
295 | + yield super(AutoupdaterTestCase, self).setUp() |
296 | + self.auto_update_path = r'path\to\exe' |
297 | + self.return_from_call = 0 |
298 | + self.command = None |
299 | + self.args = [] |
300 | + |
301 | + def fake_execute_process(command, args=None, path=None): |
302 | + """Fake async process execution.""" |
303 | + self.command = command |
304 | + self.args = args |
305 | + return self.return_from_call |
306 | + |
307 | + self.fake_logger = FakeLogger() |
308 | + self.patch(utils.windows, 'getProcessValue', fake_execute_process) |
309 | + self.patch(utils.windows, '_get_update_path', |
310 | + lambda:self.auto_update_path) |
311 | + |
312 | + |
313 | + @defer.inlineCallbacks |
314 | + def test_are_updates_present_true(self): |
315 | + """Test when updates are present.""" |
316 | + # the idea is simple, set the value to be returned from |
317 | + # the fake call, assert that we get true and also that |
318 | + # we did use the correct parameters. |
319 | + self.return_from_call = 0 |
320 | + are_present = yield utils.are_updates_present(self.fake_logger) |
321 | + self.assertTrue(are_present, 'Updates should be present.') |
322 | + # lets assert that we did use the correct args |
323 | + expected_args = ('--mode', 'unattended') |
324 | + self.assertEqual(expected_args, self.args) |
325 | + self.assertEqual(self.command, self.auto_update_path) |
326 | + |
327 | + |
328 | + @defer.inlineCallbacks |
329 | + def test_are_updates_present_false(self): |
330 | + """Test when updates are not present.""" |
331 | + # similar to test_are_updates_present_true but with diff retcode |
332 | + self.return_from_call = 40 |
333 | + are_present = yield utils.are_updates_present(self.fake_logger) |
334 | + self.assertFalse(are_present, 'Updates should NOT be present.') |
335 | + # lets assert that we did use the correct args |
336 | + expected_args = ('--mode', 'unattended') |
337 | + self.assertEqual(expected_args, self.args) |
338 | + self.assertEqual(self.command, self.auto_update_path) |
339 | + |
340 | + def test_perform_update(self): |
341 | + """Test the method that perfroms the update.""" |
342 | + self.patch(utils.windows.win32api, 'ShellExecute', self._set_called) |
343 | + utils.perform_update() |
344 | + self.assertIn(self.auto_update_path, self._called[0][2]) |
345 | + self.assertEqual('runas', self._called[0][1]) |
346 | + self.assertEqual('--unattendedmodeui none', self._called[0][3]) |
347 | + self.assertEqual('', self._called[0][4]) |
348 | + self.assertEqual(0, self._called[0][5]) |
349 | + |
350 | + def test_get_auto_update_path(self): |
351 | + """Test the method used to get the autoupdate.""" |
352 | + |
353 | + |
354 | |
355 | === modified file 'ubuntuone_installer/gui/qt/utils/windows.py' |
356 | --- ubuntuone_installer/gui/qt/utils/windows.py 2011-09-19 23:00:32 +0000 |
357 | +++ ubuntuone_installer/gui/qt/utils/windows.py 2011-09-22 19:45:30 +0000 |
358 | @@ -30,6 +30,9 @@ |
359 | import _winreg |
360 | # pylint: enable=F0401 |
361 | |
362 | +from twisted.internet import defer |
363 | +from twisted.internet.utils import getProcessValue |
364 | + |
365 | AUTORUN_KEY = r"Software\Microsoft\Windows\CurrentVersion\Run" |
366 | |
367 | |
368 | @@ -47,6 +50,47 @@ |
369 | '--mode win32', '', 0) |
370 | |
371 | |
372 | +def _get_update_path(): |
373 | + """Return the path in which the autoupdate command is found.""" |
374 | + if hasattr(sys, "frozen"): |
375 | + exec_path = os.path.abspath(sys.executable) |
376 | + else: |
377 | + exec_path = os.path.dirname(__file__) |
378 | + folder = os.path.dirname(exec_path) |
379 | + update_path = os.path.join(folder, "autoupdate-windows.exe") |
380 | + if os.path.exists(update_path): |
381 | + return update_path |
382 | + return None |
383 | + |
384 | + |
385 | +@defer.inlineCallbacks |
386 | +def are_updates_present(logger): |
387 | + """Return if there are updates for Ubuntu One.""" |
388 | + update_path = _get_update_path() |
389 | + logger.debug('Update path %s', update_path) |
390 | + if update_path is not None: |
391 | + # If there is an update present we will get 0 and other number |
392 | + # otherwise |
393 | + retcode = yield getProcessValue(update_path, args=('--mode', |
394 | + 'unattended'), path=os.path.dirname(update_path)) |
395 | + logger.debug('Return code %s', retcode) |
396 | + if retcode == 0: |
397 | + logger.debug('Returning True') |
398 | + defer.returnValue(True) |
399 | + logger.debug('Returning False') |
400 | + defer.returnValue(False) |
401 | + |
402 | + |
403 | +def perform_update(): |
404 | + """Spawn the autoupdate process and call the stop funtion.""" |
405 | + update_path = _get_update_path() |
406 | + if update_path is not None: |
407 | + # lets call the updater with the commands that are required, |
408 | + win32api.ShellExecute(None, 'runas', |
409 | + update_path, |
410 | + '--unattendedmodeui none', '', 0) |
411 | + |
412 | + |
413 | def start_control_panel(with_icon=True): |
414 | """Start the control panel.""" |
415 | # If we are in windows and "frozen", assume it's in |
... installer. gui.qt. main.tests. test_windows ainTestCase lib\site- packages\ twisted\ internet\ defer.py" , line 1020, in windows- installer- mandel\ ubuntuone_ installer\ gui\qt\ main\wi cb(creds, gui, installer, logger) lib\site- packages\ twisted\ internet\ defer.py" , line 1141, in s(None, f(*args, **kwargs), Deferred()) windows- installer- mandel\ ubuntuone_ installer\ gui\qt\ main\wi debug(' Got back from sso.') AttributeError: 'FakeLogger' object has no attribute 'debug' lib\site- packages\ twisted\ internet\ defer.py" , line 1020, in windows- installer- mandel\ ubuntuone_ installer\ gui\qt\ main\wi cb(creds, gui, installer, logger) lib\site- packages\ twisted\ internet\ defer.py" , line 1141, in s(None, f(*args, **kwargs), Deferred()) windows- installer- mandel\ ubuntuone_ installer\ gui\qt\ main\wi debug(' Got back from sso.') AttributeError: 'FakeLogger' object has no attribute 'debug' with_installed_ flag ... Traceback (most recent call last): lib\site- packages\ twisted\ internet\ defer.py" , line 1020, in windows- installer- mandel\ ubuntuone_ installer\ gui\qt\ main\te windows. py", line 150, in test_with_ installed_ flag trial.unittest. FailTest: not equal: installer. gui.qt. gui' from 'X:\ubuntuone- windows- installer- ubuntuone_ installer\ gui\qt\ gui.pyc' >, installer. gui.qt. main.tests. test_windows. FakeLogger object at 0x086 installer. gui.qt. gui' from 'X:\ubuntuone- windows- installer- ubuntuone_ installer\ gui\qt\ gui.pyc' >,
ubuntuone_
CredsFailureM
test_failure ... [OK]
test_no_creds ... Traceback (most recent call last):
File "C:\Python27\
_inlineCallbacks
result = g.send(result)
File "X:\ubuntuone-
ndows.py", line 85, in check_credentials
success_
File "C:\Python27\
unwindGenerator
return _inlineCallback
File "X:\ubuntuone-
ndows.py", line 50, in success_cb
logger.
exceptions.
[ERROR]
test_with_creds ... Traceback (most recent call last):
File "C:\Python27\
_inlineCallbacks
result = g.send(result)
File "X:\ubuntuone-
ndows.py", line 85, in check_credentials
success_
File "C:\Python27\
unwindGenerator
return _inlineCallback
File "X:\ubuntuone-
ndows.py", line 50, in success_cb
logger.
exceptions.
[ERROR]
test_
File "C:\Python27\
_inlineCallbacks
result = g.send(result)
File "X:\ubuntuone-
sts\test_
gui, True), {}))
twisted.
a = (('Something not false',
<module 'ubuntuone_
mandel\
True,
<ubuntuone_
9D3B0>),
{})
b = (('Something not false',
<module 'ubuntuone_
mandel\
True),
{})
[FAIL] without_ installed_ flag ... Traceback (most recent call last): lib\site- packages\ twisted\ internet\ defer.py" , line 1020, in windows- installer- mandel\ ubuntuone_ installer\ gui\qt\ main\te windows. py", line 139, in test_without_ installed_ flag trial.unittest. FailTest: not equal: installer. gui.qt. gui' from 'X:\ubuntuone- windows- installer- ubuntuone_ installer\ gui\qt\ gui.pyc' >, installer. gui.qt. main.tests. test_windows. FakeLogger object at 0x086
test_
File "C:\Python27\
_inlineCallbacks
result = g.send(result)
File "X:\ubuntuone-
sts\test_
gui, False), {}))
twisted.
a = (('Something not false',
<module 'ubuntuone_
mandel\
False,
<ubuntuone_
9D9B0>),
{})
b = (('Something not false',
<module 'ubunt...