Merge lp:~diegosarmentero/ubuntuone-client/ubuntuone-client-syncstate into lp:ubuntuone-client

Proposed by Diego Sarmentero
Status: Merged
Approved by: Diego Sarmentero
Approved revision: 1332
Merged at revision: 1338
Proposed branch: lp:~diegosarmentero/ubuntuone-client/ubuntuone-client-syncstate
Merge into: lp:ubuntuone-client
Diff against target: 238 lines (+110/-21)
4 files modified
tests/platform/sync_menu/test_linux.py (+50/-15)
tests/status/test_aggregator.py (+30/-0)
ubuntuone/platform/sync_menu/linux.py (+16/-6)
ubuntuone/status/aggregator.py (+14/-0)
To merge this branch: bzr merge lp:~diegosarmentero/ubuntuone-client/ubuntuone-client-syncstate
Reviewer Review Type Date Requested Status
Manuel de la Peña (community) Approve
Roberto Alsina (community) Approve
Review via email: mp+128958@code.launchpad.net

Commit message

- Recceive notifications from aggregator when the status of syncdaemon change (LP: #1053631).

To post a comment you must log in.
1332. By Diego Sarmentero

fixing link

Revision history for this message
Roberto Alsina (ralsina) wrote :

Code looks good, running tests takes way too long here :-(

review: Approve
Revision history for this message
Manuel de la Peña (mandel) wrote :

Code looks good and tests pass. I have a small idea to make things a little nicer, what about doing the foSyncllowing:

SyncMenuStatus = namedtuple('SyncMenuStatus',
    ['_connected', 'ignore_status_event', 'connect_called', 'disconnect_called'], verbose=False)

def _assert_sync_status(self, expected):
    self.assertEqual(expected.connected, self.sync_menu._connected)
    self.assertEqual(expected.ignore_status_event, self.sync_menu._ignore_status_event)
    self.assertEqual(expected.connected_called, self.sync_menu._syncdaemon_service.connect_called)
    self.assertEqual(expected.disconnected_called, self.sync_menu._syncdaemon_service.disconnect_called)

and the we can have tests like the following (based on a current test):

def test_status_change_from_menu(self):
    """Check the behavior when the status is changed from the menu."""
    self.sync_menu.change_sync_status()
    self._assert_sync_status(SyncMenuStatus(connected=False, ignore_status_event=False,
                                            connect_called=False, disconnect_called=True))

    self.sync_menu._syncdaemon_service.disconnect_called = False
    self.sync_menu.change_sync_status()

    self._assert_sync_status(SyncMenuStatus(connected=True, ignore_status_event=False,
                                            connect_called=True, disconnect_called=True))
    self.assertTrue(self.sync_menu._connected)

instead of:

71 + def test_status_change_from_menu(self):
72 + """Check the behavior when the status is changed from the menu."""
73 + self.sync_menu.change_sync_status()
74 + self.assertFalse(self.sync_menu._connected)
75 + self.assertFalse(self.sync_menu._ignore_status_event)
76 + self.assertFalse(self.sync_menu._syncdaemon_service.connect_called)
77 + self.assertTrue(self.sync_menu._syncdaemon_service.disconnect_called)
78 +
79 + self.sync_menu._syncdaemon_service.disconnect_called = False
80 + self.sync_menu.change_sync_status()
81 + self.assertTrue(self.sync_menu._connected)
82 + self.assertFalse(self.sync_menu._ignore_status_event)
83 + self.assertTrue(self.sync_menu._syncdaemon_service.connect_called)
84 + self.assertFalse(self.sync_menu._syncdaemon_service.disconnect_called)

Of course you can remove the use of the named tuple and just define the assert_method as:

def _assert_sync_status(self, connected=False, ignore_status_event=False,
                              connect_called=False, disconnect_called=False):

Which ever you prefer :) (I felt funny using the namedtuple :P )

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'tests/platform/sync_menu/test_linux.py'
--- tests/platform/sync_menu/test_linux.py 2012-10-05 15:14:55 +0000
+++ tests/platform/sync_menu/test_linux.py 2012-10-10 15:00:35 +0000
@@ -73,6 +73,18 @@
73class FakeSyncdaemonService(object):73class FakeSyncdaemonService(object):
74 """Fake SyncdaemonService."""74 """Fake SyncdaemonService."""
7575
76 def __init__(self):
77 self.connect_called = False
78 self.disconnect_called = False
79
80 def connect(self):
81 """Set connect to True."""
82 self.connect_called = True
83
84 def disconnect(self):
85 """Set connect to True."""
86 self.disconnect_called = True
87
7688
77class FakeSyncMenuApp(object):89class FakeSyncMenuApp(object):
78 """Fake SyncMenu."""90 """Fake SyncMenu."""
@@ -95,6 +107,10 @@
95 """Fake connect."""107 """Fake connect."""
96 self.data['connect'] = (signal, callback)108 self.data['connect'] = (signal, callback)
97109
110 def set_paused(self, status):
111 """Set the pause state."""
112 self.data['paused'] = status
113
98114
99class SyncMenuDummyTestCase(TestCase):115class SyncMenuDummyTestCase(TestCase):
100 """Test the SyncMenu."""116 """Test the SyncMenu."""
@@ -123,18 +139,9 @@
123 self.syncdaemon_service = FakeSyncdaemonService()139 self.syncdaemon_service = FakeSyncdaemonService()
124 self.status_frontend = FakeStatusFrontend()140 self.status_frontend = FakeStatusFrontend()
125 self._paused = False141 self._paused = False
126 self.patch(sync_menu.UbuntuOneSyncMenu, "change_sync_status",
127 self._change_sync_status)
128 self.sync_menu = sync_menu.UbuntuOneSyncMenu(self.status_frontend,142 self.sync_menu = sync_menu.UbuntuOneSyncMenu(self.status_frontend,
129 self.syncdaemon_service)143 self.syncdaemon_service)
130144
131 def _change_sync_status(self, *args):
132 """Fake change_sync_status."""
133 if self._paused:
134 self._paused = False
135 else:
136 self._paused = True
137
138 def test_init(self):145 def test_init(self):
139 """Check that the menu is properly initialized."""146 """Check that the menu is properly initialized."""
140 self.assertIsInstance(FakeSyncMenuApp.data['server'],147 self.assertIsInstance(FakeSyncMenuApp.data['server'],
@@ -161,12 +168,6 @@
161 self.assertEqual(self.sync_menu.get_help.property_get(168 self.assertEqual(self.sync_menu.get_help.property_get(
162 linux.Dbusmenu.MENUITEM_PROP_LABEL), linux.GET_HELP)169 linux.Dbusmenu.MENUITEM_PROP_LABEL), linux.GET_HELP)
163170
164 self.assertEqual(self.sync_menu.app.data['connect'],
165 ("notify::paused", self.sync_menu.change_sync_status))
166 self.sync_menu.app.data['connect'][1]()
167 self.assertTrue(self._paused)
168 self.sync_menu.app.data['connect'][1]()
169 self.assertFalse(self._paused)
170 self.sync_menu.transfers.update_progress()171 self.sync_menu.transfers.update_progress()
171 self.assertIsInstance(self.sync_menu.transfers.separator,172 self.assertIsInstance(self.sync_menu.transfers.separator,
172 linux.Dbusmenu.Menuitem)173 linux.Dbusmenu.Menuitem)
@@ -386,3 +387,37 @@
386 self.sync_menu.next_update = time.time() * 2387 self.sync_menu.next_update = time.time() * 2
387 self.sync_menu.update_transfers()388 self.sync_menu.update_transfers()
388 self.assertEqual(self.sync_menu.timer.delay, 3)389 self.assertEqual(self.sync_menu.timer.delay, 3)
390
391 def test_status_change_from_menu(self):
392 """Check the behavior when the status is changed from the menu."""
393 self.sync_menu.change_sync_status()
394 self.assertFalse(self.sync_menu._connected)
395 self.assertFalse(self.sync_menu._ignore_status_event)
396 self.assertFalse(self.sync_menu._syncdaemon_service.connect_called)
397 self.assertTrue(self.sync_menu._syncdaemon_service.disconnect_called)
398
399 self.sync_menu._syncdaemon_service.disconnect_called = False
400 self.sync_menu.change_sync_status()
401 self.assertTrue(self.sync_menu._connected)
402 self.assertFalse(self.sync_menu._ignore_status_event)
403 self.assertTrue(self.sync_menu._syncdaemon_service.connect_called)
404 self.assertFalse(self.sync_menu._syncdaemon_service.disconnect_called)
405
406 def test_ignore_status(self):
407 """Check that neither connect or disconnect are called."""
408 self.sync_menu._ignore_status_event = True
409 self.assertTrue(self.sync_menu._ignore_status_event)
410 self.sync_menu.change_sync_status()
411 self.assertTrue(self.sync_menu._connected)
412 self.assertFalse(self.sync_menu._ignore_status_event)
413 self.assertFalse(self.sync_menu._syncdaemon_service.connect_called)
414 self.assertFalse(self.sync_menu._syncdaemon_service.disconnect_called)
415
416 def test_sync_status_changed(self):
417 """Check sync_status_changed behavior."""
418 self.sync_menu.sync_status_changed(True)
419 self.assertNotIn('paused', self.sync_menu.app.data)
420 self.sync_menu.sync_status_changed(False)
421 self.assertFalse(self.sync_menu._connected)
422 self.assertTrue(self.sync_menu._ignore_status_event)
423 self.assertTrue(self.sync_menu.app.data['paused'])
389\ No newline at end of file424\ No newline at end of file
390425
=== modified file 'tests/status/test_aggregator.py'
--- tests/status/test_aggregator.py 2012-10-01 15:37:01 +0000
+++ tests/status/test_aggregator.py 2012-10-10 15:00:35 +0000
@@ -1330,6 +1330,36 @@
1330 self.aggregator.register_progress_listener, [])1330 self.aggregator.register_progress_listener, [])
1331 self.assertEqual(len(self.aggregator.progress_listeners), 0)1331 self.assertEqual(len(self.aggregator.progress_listeners), 0)
13321332
1333 def test_register_connection_listener(self):
1334 """Check that register listener handles properly additions."""
1335
1336 def fake_callback():
1337 """Do nothing."""
1338
1339 self.aggregator.register_connection_listener(fake_callback)
1340 self.assertEqual(len(self.aggregator.connection_listeners), 1)
1341
1342 def test_register_connection_listener_fail(self):
1343 """Check that register listener fails with not Callable objects."""
1344 self.assertRaises(TypeError,
1345 self.aggregator.register_connection_listener, [])
1346 self.assertEqual(len(self.aggregator.connection_listeners), 0)
1347
1348 def test_connection_notifications(self):
1349 """Check that the connection lister is notified."""
1350 data = {}
1351
1352 def fake_callback(status):
1353 """Register status."""
1354 data['status'] = status
1355
1356 self.aggregator.register_connection_listener(fake_callback)
1357 self.assertEqual(data, {})
1358 self.aggregator.connection_lost()
1359 self.assertFalse(data['status'])
1360 self.aggregator.connection_made()
1361 self.assertTrue(data['status'])
1362
1333 def assertMiscCommandQueued(self, fc):1363 def assertMiscCommandQueued(self, fc):
1334 """Assert that some command was queued."""1364 """Assert that some command was queued."""
1335 self.assertEqual(len(self.aggregator.to_do), 1)1365 self.assertEqual(len(self.aggregator.to_do), 1)
13361366
=== modified file 'ubuntuone/platform/sync_menu/linux.py'
--- ubuntuone/platform/sync_menu/linux.py 2012-10-09 14:31:11 +0000
+++ ubuntuone/platform/sync_menu/linux.py 2012-10-10 15:00:35 +0000
@@ -82,8 +82,9 @@
82 def __init__(self, status, syncdaemon_service):82 def __init__(self, status, syncdaemon_service):
83 """Initialize menu."""83 """Initialize menu."""
84 self._syncdaemon_service = syncdaemon_service84 self._syncdaemon_service = syncdaemon_service
85 self._paused = False85 self._connected = True
86 self.timer = None86 self.timer = None
87 self._ignore_status_event = False
87 self.next_update = time.time()88 self.next_update = time.time()
88 self.root_menu = Dbusmenu.Menuitem()89 self.root_menu = Dbusmenu.Menuitem()
8990
@@ -129,14 +130,23 @@
129 self.app.set_menu(self.server)130 self.app.set_menu(self.server)
130 self.app.connect("notify::paused", self.change_sync_status)131 self.app.connect("notify::paused", self.change_sync_status)
131132
133 def sync_status_changed(self, status):
134 """Listen to the changes for the sync status."""
135 if status != self._connected:
136 self._connected = status
137 self._ignore_status_event = True
138 self.app.set_paused(not self._connected)
139
132 def change_sync_status(self, *args):140 def change_sync_status(self, *args):
133 """Triggered when the sync status is changed fromm the menu."""141 """Triggered when the sync status is changed fromm the menu."""
134 if self._paused:142 if self._ignore_status_event:
143 self._ignore_status_event = False
144 elif self._connected:
145 self._syncdaemon_service.disconnect()
146 self._connected = False
147 else:
135 self._syncdaemon_service.connect()148 self._syncdaemon_service.connect()
136 self._paused = False149 self._connected = True
137 else:
138 self._syncdaemon_service.disconnect()
139 self._paused = True
140150
141 def open_control_panel(self, *args):151 def open_control_panel(self, *args):
142 """Open the Ubuntu One Control Panel."""152 """Open the Ubuntu One Control Panel."""
143153
=== modified file 'ubuntuone/status/aggregator.py'
--- ubuntuone/status/aggregator.py 2012-10-01 15:37:01 +0000
+++ ubuntuone/status/aggregator.py 2012-10-10 15:00:35 +0000
@@ -616,6 +616,7 @@
616 self.progress = {}616 self.progress = {}
617 self.to_do = {}617 self.to_do = {}
618 self.recent_transfers = deque(maxlen=5)618 self.recent_transfers = deque(maxlen=5)
619 self.connection_listeners = []
619 self.progress_listeners = []620 self.progress_listeners = []
620621
621 def get_notification(self):622 def get_notification(self):
@@ -654,6 +655,13 @@
654 else:655 else:
655 raise TypeError("Callable object expected.")656 raise TypeError("Callable object expected.")
656657
658 def register_connection_listener(self, listener):
659 """Register a callable object to be notified."""
660 if isinstance(listener, Callable):
661 self.connection_listeners.append(listener)
662 else:
663 raise TypeError("Callable object expected.")
664
657 def get_discovery_message(self):665 def get_discovery_message(self):
658 """Get the text for the discovery bubble."""666 """Get the text for the discovery bubble."""
659 lines = []667 lines = []
@@ -793,10 +801,14 @@
793 def connection_lost(self):801 def connection_lost(self):
794 """The connection to the server was lost."""802 """The connection to the server was lost."""
795 self.file_discovery_bubble.connection_lost()803 self.file_discovery_bubble.connection_lost()
804 for callback in self.connection_listeners:
805 callback(False)
796806
797 def connection_made(self):807 def connection_made(self):
798 """The connection to the server was made."""808 """The connection to the server was made."""
799 self.file_discovery_bubble.connection_made()809 self.file_discovery_bubble.connection_made()
810 for callback in self.connection_listeners:
811 callback(True)
800812
801813
802class StatusFrontend(object):814class StatusFrontend(object):
@@ -818,6 +830,8 @@
818 if self.syncdaemon_service is not None:830 if self.syncdaemon_service is not None:
819 self.sync_menu = sync_menu.UbuntuOneSyncMenu(self,831 self.sync_menu = sync_menu.UbuntuOneSyncMenu(self,
820 self.syncdaemon_service)832 self.syncdaemon_service)
833 self.aggregator.register_connection_listener(
834 self.sync_menu.sync_status_changed)
821 self.aggregator.register_progress_listener(835 self.aggregator.register_progress_listener(
822 self.sync_menu.update_transfers)836 self.sync_menu.update_transfers)
823837

Subscribers

People subscribed via source and target branches