Merge lp:~nataliabidart/ubuntuone-control-panel/dont-start-syncdaemon into lp:ubuntuone-control-panel

Proposed by Natalia Bidart
Status: Merged
Approved by: Natalia Bidart
Approved revision: 138
Merged at revision: 136
Proposed branch: lp:~nataliabidart/ubuntuone-control-panel/dont-start-syncdaemon
Merge into: lp:ubuntuone-control-panel
Diff against target: 335 lines (+99/-57)
5 files modified
ubuntuone/controlpanel/backend.py (+1/-2)
ubuntuone/controlpanel/dbus_service.py (+5/-4)
ubuntuone/controlpanel/gtk/gui.py (+48/-39)
ubuntuone/controlpanel/gtk/tests/test_gui_basic.py (+8/-11)
ubuntuone/controlpanel/integrationtests/test_dbus_service.py (+37/-1)
To merge this branch: bzr merge lp:~nataliabidart/ubuntuone-control-panel/dont-start-syncdaemon
Reviewer Review Type Date Requested Status
Shane Fagan (community) Approve
Roman Yepishev (community) fieldtest Approve
Review via email: mp+57595@code.launchpad.net

Commit message

- Fixed (LP: #744731) with:
- Avoid creating a control-panel-backend in the OverviewPanel.
- Avoid FileSyncService and FileSyncStatus to start syncdaemon until load() is called.
- Make the dbus layer for the control panel backend not set the FileStatusChanged signal until is actually needed

To post a comment you must log in.
Revision history for this message
Roman Yepishev (rye) wrote :

SD is not started immediately upon launching. One has actually enter the credentials first for syncdaemon to start doing things.

review: Approve (fieldtest)
Revision history for this message
Shane Fagan (shanepatrickfagan) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ubuntuone/controlpanel/backend.py'
2--- ubuntuone/controlpanel/backend.py 2011-04-12 13:13:58 +0000
3+++ ubuntuone/controlpanel/backend.py 2011-04-13 21:06:35 +0000
4@@ -108,7 +108,6 @@
5 self.shutdown_func = shutdown_func
6 self.wc = WebClient(dbus_client.get_credentials)
7 self._status_changed_handler = None
8- self.status_changed_handler = lambda *a: None
9
10 self._volumes = {} # cache last known volume info
11 self.file_sync_disabled = False
12@@ -175,7 +174,7 @@
13 self._status_changed_handler = process_and_callback
14 dbus_client.set_status_changed_handler(process_and_callback)
15
16- def _get_status_changed_handler(self, handler):
17+ def _get_status_changed_handler(self):
18 """Return the handler to be called when file sync status changes."""
19 return self._status_changed_handler
20
21
22=== modified file 'ubuntuone/controlpanel/dbus_service.py'
23--- ubuntuone/controlpanel/dbus_service.py 2011-04-07 14:30:20 +0000
24+++ ubuntuone/controlpanel/dbus_service.py 2011-04-13 21:06:35 +0000
25@@ -118,11 +118,9 @@
26 """Create this instance of the backend."""
27 super(ControlPanelBackend, self).__init__(*args, **kwargs)
28 self.backend = backend
29- self.backend.status_changed_handler = self.process_status
30 self.transform = lambda f: transform_failure(f, self.UnauthorizedError)
31- logger.debug('ControlPanelBackend: created with %r, %r.\n'
32- 'status_changed_handler is %r.',
33- args, kwargs, self.process_status)
34+ logger.debug('ControlPanelBackend: created with %r, %r.',
35+ args, kwargs)
36
37 # pylint: disable=C0103
38
39@@ -243,6 +241,9 @@
40 @method(dbus_interface=DBUS_PREFERENCES_IFACE, in_signature="")
41 def file_sync_status(self):
42 """Get the status of the file sync service."""
43+ if self.backend.status_changed_handler is None:
44+ self.backend.status_changed_handler = self.process_status
45+
46 d = self.backend.file_sync_status()
47 d.addCallback(self.process_status)
48 d.addErrback(self.transform(self.FileSyncStatusError))
49
50=== modified file 'ubuntuone/controlpanel/gtk/gui.py'
51--- ubuntuone/controlpanel/gtk/gui.py 2011-04-12 13:46:26 +0000
52+++ ubuntuone/controlpanel/gtk/gui.py 2011-04-13 21:06:35 +0000
53@@ -161,18 +161,21 @@
54 class ControlPanelMixin(object):
55 """The main interface for the Ubuntu One control panel."""
56
57- def __init__(self, filename=None):
58- bus = dbus.SessionBus()
59- try:
60- obj = bus.get_object(DBUS_BUS_NAME,
61- DBUS_PREFERENCES_PATH,
62- follow_name_owner_changes=True)
63- iface = DBUS_PREFERENCES_IFACE
64- self.backend = dbus.Interface(obj, dbus_interface=iface)
65- except dbus.exceptions.DBusException:
66- logger.exception('Can not connect to DBus at %r',
67- (DBUS_BUS_NAME, DBUS_PREFERENCES_PATH))
68- raise
69+ def __init__(self, filename=None, backend_instance=None):
70+ if backend_instance is not None:
71+ self.backend = backend_instance
72+ else:
73+ bus = dbus.SessionBus()
74+ try:
75+ obj = bus.get_object(DBUS_BUS_NAME,
76+ DBUS_PREFERENCES_PATH,
77+ follow_name_owner_changes=True)
78+ iface = DBUS_PREFERENCES_IFACE
79+ self.backend = dbus.Interface(obj, dbus_interface=iface)
80+ except dbus.exceptions.DBusException:
81+ logger.exception('Can not connect to DBus at %r',
82+ (DBUS_BUS_NAME, DBUS_PREFERENCES_PATH))
83+ raise
84
85 if filename is not None:
86 builder = gtk.Builder()
87@@ -284,39 +287,42 @@
88
89 def __init__(self, main_window):
90 GreyableBin.__init__(self)
91- ControlPanelMixin.__init__(self, filename='overview.ui')
92- self.add(self.itself)
93- self.warning_label.set_text('')
94- self.warning_label.set_property('xalign', 0.5)
95-
96- self.connect_button.set_uri(self.CONNECT)
97-
98- self.main_window = main_window
99- self._credentials_are_new = False
100- self.show()
101-
102+
103+ sso_backend = None
104 bus = dbus.SessionBus()
105 try:
106 obj = bus.get_object(ubuntu_sso.DBUS_BUS_NAME,
107 ubuntu_sso.DBUS_CREDENTIALS_PATH,
108 follow_name_owner_changes=True)
109 iface = ubuntu_sso.DBUS_CREDENTIALS_IFACE
110- self.sso_backend = dbus.Interface(obj, dbus_interface=iface)
111+ sso_backend = dbus.Interface(obj, dbus_interface=iface)
112 except dbus.exceptions.DBusException:
113 logger.exception('Can not connect to DBus at %r',
114 (ubuntu_sso.DBUS_BUS_NAME,
115 ubuntu_sso.DBUS_CREDENTIALS_PATH))
116 raise
117
118- # Disconnect signals!!! (LP: #673667)
119- self.sso_backend.connect_to_signal('CredentialsFound',
120- self.on_credentials_found)
121- self.sso_backend.connect_to_signal('CredentialsNotFound',
122- self.on_credentials_not_found)
123- self.sso_backend.connect_to_signal('CredentialsError',
124- self.on_credentials_error)
125- self.sso_backend.connect_to_signal('AuthorizationDenied',
126- self.on_authorization_denied)
127+ ControlPanelMixin.__init__(self, filename='overview.ui',
128+ backend_instance=sso_backend)
129+ self.add(self.itself)
130+ self.warning_label.set_text('')
131+ self.warning_label.set_property('xalign', 0.5)
132+
133+ self.connect_button.set_uri(self.CONNECT)
134+
135+ self.main_window = main_window
136+ self._credentials_are_new = False
137+ self.show()
138+
139+ self.backend.connect_to_signal('CredentialsFound',
140+ self.on_credentials_found)
141+ self.backend.connect_to_signal('CredentialsNotFound',
142+ self.on_credentials_not_found)
143+ self.backend.connect_to_signal('CredentialsError',
144+ self.on_credentials_error)
145+ self.backend.connect_to_signal('AuthorizationDenied',
146+ self.on_authorization_denied)
147+
148 kw = dict(result_cb=self.on_network_state_changed)
149 self.network_manager_state = networkstate.NetworkManagerState(**kw)
150 self.network_manager_state.find_online_state()
151@@ -348,7 +354,7 @@
152 settings = {TC_URL_KEY: U1_TC_URL, HELP_TEXT_KEY: U1_DESCRIPTION,
153 WINDOW_ID_KEY: str(self.main_window.window.xid),
154 PING_URL_KEY: U1_PING_URL}
155- self.sso_backend.register(U1_APP_NAME, settings,
156+ self.backend.register(U1_APP_NAME, settings,
157 reply_handler=NO_OP, error_handler=error_handler)
158 self.set_property('greyed', True)
159 self.warning_label.set_text('')
160@@ -358,7 +364,7 @@
161 settings = {TC_URL_KEY: U1_TC_URL, HELP_TEXT_KEY: U1_DESCRIPTION,
162 WINDOW_ID_KEY: str(self.main_window.window.xid),
163 PING_URL_KEY: U1_PING_URL}
164- self.sso_backend.login(U1_APP_NAME, settings,
165+ self.backend.login(U1_APP_NAME, settings,
166 reply_handler=NO_OP, error_handler=error_handler)
167 self.set_property('greyed', True)
168 self.warning_label.set_text('')
169@@ -405,7 +411,7 @@
170 else:
171 self.set_sensitive(True)
172 self.warning_label.set_text(msg)
173- self.sso_backend.find_credentials(U1_APP_NAME, {},
174+ self.backend.find_credentials(U1_APP_NAME, {},
175 reply_handler=NO_OP, error_handler=error_handler)
176
177
178@@ -1080,9 +1086,6 @@
179 self.backend.connect_to_signal('FilesEnabled', self.on_files_enabled)
180 self.backend.connect_to_signal('FilesDisabled', self.on_files_disabled)
181
182- self.backend.file_sync_status(reply_handler=NO_OP,
183- error_handler=error_handler)
184-
185 @log_call(logger.debug)
186 def on_file_sync_status_changed(self, status):
187 """File Sync status changed."""
188@@ -1117,6 +1120,11 @@
189 self.backend.disable_files(reply_handler=NO_OP,
190 error_handler=error_handler)
191
192+ def load(self):
193+ """Load the information."""
194+ self.backend.file_sync_status(reply_handler=NO_OP,
195+ error_handler=error_handler)
196+
197
198 class DesktopcouchService(Service):
199 """A desktopcouch service."""
200@@ -1248,6 +1256,7 @@
201 @log_call(logger.debug)
202 def load(self):
203 """Load info."""
204+ self.file_sync_service.load()
205 self.replications.hide()
206 if self.install_box is not None:
207 self.itself.remove(self.install_box)
208
209=== modified file 'ubuntuone/controlpanel/gtk/tests/test_gui_basic.py'
210--- ubuntuone/controlpanel/gtk/tests/test_gui_basic.py 2011-04-11 17:30:04 +0000
211+++ ubuntuone/controlpanel/gtk/tests/test_gui_basic.py 2011-04-13 21:06:35 +0000
212@@ -445,17 +445,17 @@
213
214 def test_sso_backend(self):
215 """Has a correct SSO backend."""
216- self.assertIsInstance(self.ui.sso_backend, FakedSSOBackend)
217+ self.assertIsInstance(self.ui.backend, FakedSSOBackend)
218
219 def test_sso_backend_signals(self):
220 """The proper signals are connected to the backend."""
221- self.assertEqual(self.ui.sso_backend._signals['CredentialsFound'],
222+ self.assertEqual(self.ui.backend._signals['CredentialsFound'],
223 [self.ui.on_credentials_found])
224- self.assertEqual(self.ui.sso_backend._signals['CredentialsNotFound'],
225+ self.assertEqual(self.ui.backend._signals['CredentialsNotFound'],
226 [self.ui.on_credentials_not_found])
227- self.assertEqual(self.ui.sso_backend._signals['CredentialsError'],
228+ self.assertEqual(self.ui.backend._signals['CredentialsError'],
229 [self.ui.on_credentials_error])
230- self.assertEqual(self.ui.sso_backend._signals['AuthorizationDenied'],
231+ self.assertEqual(self.ui.backend._signals['AuthorizationDenied'],
232 [self.ui.on_authorization_denied])
233
234
235@@ -507,8 +507,7 @@
236 def test_find_credentials_is_called(self):
237 """Credentials are asked to SSO backend."""
238 self.assertFalse(self.ui._credentials_are_new)
239- self.assert_backend_called('find_credentials', (gui.U1_APP_NAME, {}),
240- backend=self.ui.sso_backend)
241+ self.assert_backend_called('find_credentials', (gui.U1_APP_NAME, {}))
242
243 def test_on_credentials_found(self):
244 """Callback 'on_credentials_found' is correct."""
245@@ -630,8 +629,7 @@
246 gui.HELP_TEXT_KEY: gui.U1_DESCRIPTION,
247 gui.WINDOW_ID_KEY: str(window_id),
248 gui.PING_URL_KEY: gui.U1_PING_URL})
249- self.assert_backend_called('register', args,
250- backend=self.ui.sso_backend)
251+ self.assert_backend_called('register', args)
252
253 def test_connect_button_clicked(self):
254 """Test the 'join now' button callback."""
255@@ -646,8 +644,7 @@
256 gui.HELP_TEXT_KEY: gui.U1_DESCRIPTION,
257 gui.WINDOW_ID_KEY: str(window_id),
258 gui.PING_URL_KEY: gui.U1_PING_URL})
259- self.assert_backend_called('login', args,
260- backend=self.ui.sso_backend)
261+ self.assert_backend_called('login', args)
262
263 def test_join_now_button_clicked_set_greyed(self):
264 """Clicking on 'join_now' self is greyed."""
265
266=== modified file 'ubuntuone/controlpanel/integrationtests/test_dbus_service.py'
267--- ubuntuone/controlpanel/integrationtests/test_dbus_service.py 2011-04-06 19:31:04 +0000
268+++ ubuntuone/controlpanel/integrationtests/test_dbus_service.py 2011-04-13 21:06:35 +0000
269@@ -122,11 +122,11 @@
270 dbus_service.MSG_KEY: 'test me please',
271 dbus_service.STATUS_KEY: dbus_service.FILE_SYNC_IDLE,
272 }
273- status_changed_handler = None
274 shutdown_func = None
275
276 def __init__(self, shutdown_func=None):
277 MockBackend.shutdown_func = shutdown_func
278+ self._status_changed_handler = []
279
280 def _process(self, result):
281 """Process the request with the given result."""
282@@ -135,6 +135,24 @@
283 return defer.fail(self.exception(result))
284 return defer.succeed(result)
285
286+ def _set_status_changed_handler(self, handler):
287+ """Set 'handler' to be called when file sync status changes."""
288+ if handler is not None:
289+ self._status_changed_handler.append(handler)
290+ else:
291+ self._status_changed_handler = []
292+
293+ def _get_status_changed_handler(self):
294+ """Return the handler to be called when file sync status changes."""
295+ if len(self._status_changed_handler) > 0:
296+ result = self._status_changed_handler[-1]
297+ else:
298+ result = None
299+ return result
300+
301+ status_changed_handler = property(_get_status_changed_handler,
302+ _set_status_changed_handler)
303+
304 def account_info(self):
305 """Get the user account info."""
306 return self._process(SAMPLE_ACCOUNT_INFO)
307@@ -737,10 +755,28 @@
308 def test_status_changed_handler(self):
309 """The status changed handler is properly set."""
310 be = MockBackend()
311+ dbus_service.ControlPanelBackend(backend=be)
312+
313+ self.assertEqual(be.status_changed_handler, None)
314+
315+ def test_status_changed_handler_after_status_requested(self):
316+ """The status changed handler is properly set."""
317+ be = MockBackend()
318 cpbe = dbus_service.ControlPanelBackend(backend=be)
319+ cpbe.file_sync_status()
320
321 self.assertEqual(be.status_changed_handler, cpbe.process_status)
322
323+ def test_status_changed_handler_after_status_requested_twice(self):
324+ """The status changed handler is properly set."""
325+ be = MockBackend()
326+ cpbe = dbus_service.ControlPanelBackend(backend=be)
327+ cpbe.file_sync_status()
328+ cpbe.file_sync_status()
329+
330+ # pylint: disable=W0212
331+ self.assertEqual(be._status_changed_handler, [cpbe.process_status])
332+
333
334 class ShutdownTestCase(BaseTestCase):
335 """Test for the DBus service shurdown."""

Subscribers

People subscribed via source and target branches