Merge lp:~diegosarmentero/ubuntuone-client/network-detect into lp:ubuntuone-client

Proposed by Diego Sarmentero on 2012-01-13
Status: Merged
Approved by: Natalia Bidart on 2012-02-18
Approved revision: 1187
Merged at revision: 1196
Proposed branch: lp:~diegosarmentero/ubuntuone-client/network-detect
Merge into: lp:ubuntuone-client
Diff against target: 754 lines (+37/-514)
12 files modified
tests/platform/linux/test_dbus.py (+5/-39)
tests/platform/windows/test_ipc.py (+0/-4)
tests/platform/windows/test_network_manager.py (+0/-71)
tests/syncdaemon/test_action_queue.py (+1/-104)
tests/syncdaemon/test_interaction_interfaces.py (+16/-1)
tests/syncdaemon/test_states.py (+0/-52)
ubuntuone/platform/__init__.py (+1/-0)
ubuntuone/platform/linux/dbus_interface.py (+0/-67)
ubuntuone/platform/windows/ipc.py (+0/-15)
ubuntuone/platform/windows/network_manager.py (+0/-160)
ubuntuone/syncdaemon/interaction_interfaces.py (+13/-0)
ubuntuone/syncdaemon/states.py (+1/-1)
To merge this branch: bzr merge lp:~diegosarmentero/ubuntuone-client/network-detect
Reviewer Review Type Date Requested Status
Natalia Bidart 2012-01-13 Approve on 2012-02-18
Manuel de la Peña (community) Approve on 2012-01-18
Review via email: mp+88545@code.launchpad.net

Commit Message

- The current network manager is now calling network_connected properly (LP: #885292).

Description of the Change

To test it IRL you can execute syncdaemon, and you can see the logs for online/offline if you connect and disconnect the computer.

To post a comment you must log in.
Natalia Bidart (nataliabidart) wrote :

I can not branch this branch, I'm getting:

nessita@dali:~/canonical/client$ bzr branch lp:~diegosarmentero/ubuntuone-client/network-detect
bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/~diegosarmentero/ubuntuone-client/network-detect/": location is a repository.
nessita@dali:~/canonical/client$

Also, this MP is empty, so... can you please check what happened?
Thanks!

review: Needs Fixing
Manuel de la Peña (mandel) wrote :
Download full text (4.8 KiB)

I'm getting the following when I run the tests on windows:

C:\Users\Mandel\Projects\Canonical\ubuntu-sso-client\gtk-ui-executable>run-tests

Checking if python 2.7 is in the system
ERROR: The system was unable to find the specified registry key or value.
Checking if python 2.6 is in the system
ERROR: The system was unable to find the specified registry key or value.
Checking if python 2.7 32 is in the system
Python found, building auto-generated modules...
running build
Compiled data\qt\choose_sign_in.ui into ubuntu_sso\qt\choose_sign_in_ui.py
Compiled data\qt\current_user_sign_in.ui into ubuntu_sso\qt\current_user_sign_in
_ui.py
Compiled data\qt\email_verification.ui into ubuntu_sso\qt\email_verification_ui.
py
Compiled data\qt\error_message.ui into ubuntu_sso\qt\error_message_ui.py
Compiled data\qt\forgotten_password.ui into ubuntu_sso\qt\forgotten_password_ui.
py
Compiled data\qt\reset_password.ui into ubuntu_sso\qt\reset_password_ui.py
Compiled data\qt\setup_account.ui into ubuntu_sso\qt\setup_account_ui.py
Compiled data\qt\success_message.ui into ubuntu_sso\qt\success_message_ui.py
running build_py
creating build
creating build\lib
creating build\lib\ubuntu_sso
copying ubuntu_sso\account.py -> build\lib\ubuntu_sso
copying ubuntu_sso\credentials.py -> build\lib\ubuntu_sso
copying ubuntu_sso\logger.py -> build\lib\ubuntu_sso
copying ubuntu_sso\__init__.py -> build\lib\ubuntu_sso
creating build\lib\ubuntu_sso\utils
copying ubuntu_sso\utils\ipc.py -> build\lib\ubuntu_sso\utils
copying ubuntu_sso\utils\tcpactivation.py -> build\lib\ubuntu_sso\utils
copying ubuntu_sso\utils\txsecrets.py -> build\lib\ubuntu_sso\utils
copying ubuntu_sso\utils\ui.py -> build\lib\ubuntu_sso\utils
copying ubuntu_sso\utils\__init__.py -> build\lib\ubuntu_sso\utils
creating build\lib\ubuntu_sso\keyring
copying ubuntu_sso\keyring\linux.py -> build\lib\ubuntu_sso\keyring
copying ubuntu_sso\keyring\windows.py -> build\lib\ubuntu_sso\keyring
copying ubuntu_sso\keyring\__init__.py -> build\lib\ubuntu_sso\keyring
creating build\lib\ubuntu_sso\networkstate
copying ubuntu_sso\networkstate\linux.py -> build\lib\ubuntu_sso\networkstate
copying ubuntu_sso\networkstate\windows.py -> build\lib\ubuntu_sso\networkstate
copying ubuntu_sso\networkstate\__init__.py -> build\lib\ubuntu_sso\networkstate

creating build\lib\ubuntu_sso\main
copying ubuntu_sso\main\linux.py -> build\lib\ubuntu_sso\main
copying ubuntu_sso\main\windows.py -> build\lib\ubuntu_sso\main
copying ubuntu_sso\main\__init__.py -> build\lib\ubuntu_sso\main
creating build\lib\ubuntu_sso\gtk
copying ubuntu_sso\gtk\gui.py -> build\lib\ubuntu_sso\gtk
copying ubuntu_sso\gtk\main.py -> build\lib\ubuntu_sso\gtk
copying ubuntu_sso\gtk\__init__.py -> build\lib\ubuntu_sso\gtk
creating build\lib\ubuntu_sso\qt
copying ubuntu_sso\qt\choose_sign_in_ui.py -> build\lib\ubuntu_sso\qt
copying ubuntu_sso\qt\common.py -> build\lib\ubuntu_sso\qt
copying ubuntu_sso\qt\controllers.py -> build\lib\ubuntu_sso\qt
copying ubuntu_sso\qt\current_user_sign_in_ui.py -> build\lib\ubuntu_sso\qt
copying ubuntu_sso\qt\email_verification_ui.py -> build\lib\ubuntu_sso\qt
copying ubuntu_sso\qt\error_message_ui.py -> build\lib\ubuntu_sso\qt
copying ubun...

Read more...

review: Needs Fixing
Manuel de la Peña (mandel) wrote :

Ag, sorry wrong branch :(

Natalia Bidart (nataliabidart) wrote :

* This import:

from ubuntu_sso.networkstate import ONLINE

has to be in the same group as:

from twisted.internet import defer
from ubuntuone.devtools.handlers import MementoHandler

Same for from ubuntu_sso.networkstate import NetworkManagerState.

* "# This imports needs to be here in order to belongs to this namespace" -> "# These imports needs to be here in order to belongs to this namespace"

* Since now NetworkManagerState is multiplatform, you should move it to intercation_interfaces. So, remove the instance of NetworkManagerState in each windows/linux implementation, and add it to SyncdaemonService class, right after the send_events var is assigned.

review: Needs Fixing
Manuel de la Peña (mandel) wrote :

This is for this branch:

C:\Users\Mandel\Projects\Canonical\ubuntuone-client\network-detect>run-tests.bat
 >> test.out
ERROR: The system was unable to find the specified registry key or value.
ERROR: The system was unable to find the specified registry key or value.
Traceback (most recent call last):
  File "C:\Python27\\Scripts\u1trial", line 325, in <module>
    main()
  File "C:\Python27\\Scripts\u1trial", line 305, in main
    suite = trial_runner.get_suite(config)
  File "C:\Python27\\Scripts\u1trial", line 184, in get_suite
    config['ignore-paths']))
  File "C:\Python27\\Scripts\u1trial", line 168, in _collect_tests
    module_suite = self._load_unittest(filepath)
  File "C:\Python27\\Scripts\u1trial", line 108, in _load_unittest
    module = __import__(modpath, None, None, [""])
  File "C:\Users\Mandel\Projects\Canonical\ubuntuone-client\network-detect\tests
\platform\windows\test_network_manager.py", line 23, in <module>
    from ubuntuone.platform.windows.network_manager import NetworkManager
ImportError: No module named network_manager

That is when trying to run the tests on Windows.

review: Needs Fixing
Natalia Bidart (nataliabidart) wrote :

Also, when trying to run tests on windows I'm getting:

  File "E:\client\review_network-detect\tests\platform\windows\test_network_mana
ger.py", line 23, in <module>
    from ubuntuone.platform.windows.network_manager import NetworkManager
ImportError: No module named network_manager

1180. By Diego Sarmentero on 2012-01-18

Merge.
Move Network Manager State to interaction interfaces.

1181. By Diego Sarmentero on 2012-01-18

removed test network manager file.

Manuel de la Peña (mandel) wrote :

All tests passed on Linux P and Windows.

review: Approve
Natalia Bidart (nataliabidart) wrote :

Can you please also remove this bit from ubuntuone/platform/linux/dbus_interface.py?

        # remove the NM's StateChanged signal receiver
        self.system_bus.remove_signal_receiver(self.connection_state_changed,
                               signal_name='StateChanged',
                               dbus_interface='org.freedesktop.NetworkManager',
                               path='/org/freedesktop/NetworkManager')

The rest looks good, works OK on linux, and I'm setting up my windows VM to test it IRL there.

review: Needs Fixing
Diego Sarmentero (diegosarmentero) wrote :

> Can you please also remove this bit from
> ubuntuone/platform/linux/dbus_interface.py?
>
> # remove the NM's StateChanged signal receiver
> self.system_bus.remove_signal_receiver(self.connection_state_changed,
> signal_name='StateChanged',
> dbus_interface='org.freedesktop.NetworkManager',
> path='/org/freedesktop/NetworkManager')
>
> The rest looks good, works OK on linux, and I'm setting up my windows VM to
> test it IRL there.

Done!

1182. By Diego Sarmentero on 2012-01-27

merge

1183. By Diego Sarmentero on 2012-01-27

merge

1184. By Diego Sarmentero on 2012-02-06

Removing dbus code for network detect.

Natalia Bidart (nataliabidart) wrote :

Hum, I did not notice this before, but there are still some NM code:

nessita@dali:~/canonical/client/review_network-detect$ grep NetworkManager *
contrib/dbus-docs:36: FakeNetworkManager,
contrib/dbus-docs:171: nm = FakeNetworkManager(bus)
tests/syncdaemon/test_action_queue.py:1386: expected = ['SYS_NET_CONNECTED', # from the DBus fake NetworkManager
tests/platform/linux/test_dbus.py:48:class FakeNetworkManager(DBusExposedObject):
tests/platform/linux/test_dbus.py:49: """ A fake NetworkManager that only emits StatusChanged signal. """
tests/platform/linux/test_dbus.py:52: path = '/org/freedesktop/NetworkManager'
tests/platform/linux/test_dbus.py:57: self.bus.request_name('org.freedesktop.NetworkManager',
tests/platform/linux/test_dbus.py:61: self.busName = dbus.service.BusName('org.freedesktop.NetworkManager',
tests/platform/linux/test_dbus.py:67: """ Shutdown the fake NetworkManager """
tests/platform/linux/test_dbus.py:73: @dbus.service.signal('org.freedesktop.NetworkManager', signature='i')
tests/platform/linux/test_dbus.py:95: @dbus.service.method('org.freedesktop.NetworkManager')
tests/platform/linux/test_dbus.py:121: self.nm = FakeNetworkManager(self.bus)
tests/platform/linux/test_dbus.py:211:class NetworkManagerIntegrationTests(IPCTestCase):
tests/platform/linux/test_dbus.py:212: """Test case for our NetworkManager integration."""
ubuntuone/platform/linux/dbus_interface.py:44:# NetworkManager State constants
ubuntuone/platform/linux/dbus_interface.py:864: logger.error("Error while getting the NetworkManager state %s",
ubuntuone/platform/linux/dbus_interface.py:866: # If we get an error back from NetworkManager, we should
ubuntuone/platform/linux/dbus_interface.py:868: # NetworkManager is down or broken or something.

Can you also remove those?

1185. By Diego Sarmentero on 2012-02-07

merge

1186. By Diego Sarmentero on 2012-02-07

run-tests.bat reverted

1187. By Diego Sarmentero on 2012-02-10

Remove some references to NetworkManager

Natalia Bidart (nataliabidart) wrote :

Looks good. Still we have a FakedNetworkManager in test_dbus, so I filled bug #935389 so we can land this branch.

Tested IRL, works as expected!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'tests/platform/linux/test_dbus.py'
2--- tests/platform/linux/test_dbus.py 2011-11-30 19:30:00 +0000
3+++ tests/platform/linux/test_dbus.py 2012-02-10 13:42:19 +0000
4@@ -39,8 +39,8 @@
5 DBUS_IFACE_FOLDERS_NAME,
6 DBUS_IFACE_PUBLIC_FILES_NAME,
7 DBUS_IFACE_LAUNCHER_NAME,
8- NM_STATE_CONNECTED_GLOBAL,
9- NM_STATE_DISCONNECTED,
10+# NM_STATE_CONNECTED_GLOBAL,
11+# NM_STATE_DISCONNECTED,
12 )
13 from ubuntuone.platform.tools.linux import DBusClient
14
15@@ -76,11 +76,11 @@
16
17 def emit_connected(self):
18 """ Emits the signal StateCganged(3). """
19- self.StateChanged(NM_STATE_CONNECTED_GLOBAL)
20+ self.StateChanged(70)
21
22 def emit_disconnected(self):
23 """ Emits the signal StateCganged(4). """
24- self.StateChanged(NM_STATE_DISCONNECTED)
25+ self.StateChanged(20)
26
27 @dbus.service.method(dbus.PROPERTIES_IFACE,
28 in_signature='ss', out_signature='v',
29@@ -95,7 +95,7 @@
30 @dbus.service.method('org.freedesktop.NetworkManager')
31 def state(self):
32 """Fake the state."""
33- return NM_STATE_CONNECTED_GLOBAL
34+ return 70
35
36 # pylint: enable-msg=C0103
37
38@@ -208,40 +208,6 @@
39 DBusTwistedTestCase = IPCTestCase # API compatibility
40
41
42-class NetworkManagerIntegrationTests(IPCTestCase):
43- """Test case for our NetworkManager integration."""
44-
45- def test_nm_signals(self):
46- """Test that NM signals are received and handled properly."""
47- result = None
48- d = defer.Deferred()
49-
50- class Listener(object):
51- """Helper class."""
52-
53- # class-closure, cannot use self, pylint: disable=E0213
54- def handle_SYS_NET_CONNECTED(innerself):
55- self.nm.emit_disconnected()
56-
57- def handle_SYS_NET_DISCONNECTED(innerself):
58- self.assertTrue(result)
59-
60- listener = Listener()
61- self.event_q.subscribe(listener)
62-
63- def empty_queue_cb():
64- d.callback(True)
65-
66- def callback(result):
67- self.event_q.unsubscribe(listener)
68- self.event_q.remove_empty_event_queue_callback(empty_queue_cb)
69- d.addCallback(callback)
70-
71- self.nm.emit_connected()
72- self.event_q.add_empty_event_queue_callback(empty_queue_cb)
73- return d
74-
75-
76 class StatusTestCase(IPCTestCase):
77 """Tests for the Status exposed object."""
78
79
80=== modified file 'tests/platform/windows/test_ipc.py'
81--- tests/platform/windows/test_ipc.py 2011-10-28 19:17:47 +0000
82+++ tests/platform/windows/test_ipc.py 2012-02-10 13:42:19 +0000
83@@ -652,10 +652,6 @@
84 'Remote object should not be None')
85 self.assertIsInstance(remote, RemoteReference)
86
87- def test_daemonized(self):
88- """Check that the NM thread won't block the process."""
89- self.assertTrue(self.interface.network_manager_thread.daemon)
90-
91
92 class IPCPortTestCase(TestCase):
93 """Tests for the ipc port setup."""
94
95=== removed file 'tests/platform/windows/test_network_manager.py'
96--- tests/platform/windows/test_network_manager.py 2011-10-28 18:43:23 +0000
97+++ tests/platform/windows/test_network_manager.py 1970-01-01 00:00:00 +0000
98@@ -1,71 +0,0 @@
99-# -*- coding: utf-8 -*-
100-#
101-# Author: Manuel de la Pena<manuel@canonical.com>
102-#
103-# Copyright 2011 Canonical Ltd.
104-#
105-# This program is free software: you can redistribute it and/or modify it
106-# under the terms of the GNU General Public License version 3, as published
107-# by the Free Software Foundation.
108-#
109-# This program is distributed in the hope that it will be useful, but
110-# WITHOUT ANY WARRANTY; without even the implied warranties of
111-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
112-# PURPOSE. See the GNU General Public License for more details.
113-#
114-# You should have received a copy of the GNU General Public License along
115-# with this program. If not, see <http://www.gnu.org/licenses/>.
116-
117-"""Tests for the network manager."""
118-
119-from mocker import MockerTestCase
120-
121-from ubuntuone.platform.windows.network_manager import NetworkManager
122-
123-
124-class TestNetworkManager(MockerTestCase):
125- """Test he Network Manager."""
126-
127- def setUp(self):
128- super(TestNetworkManager, self).setUp()
129- self.connection_info = self.mocker.mock()
130- self.connection_no_info = self.mocker.mock()
131- self.disconnected = self.mocker.mock()
132- self.manager = NetworkManager(self.connection_no_info,
133- self.connection_info, self.disconnected)
134-
135- def test_connection_made(self):
136- """Ensure db is called."""
137- self.connection_info()
138- self.mocker.replay()
139- self.manager.ConnectionMade()
140-
141- def test_connection_made_no_cb(self):
142- """Ensure db is called."""
143- self.manager.connected_cb_info = None
144- self.mocker.replay()
145- self.manager.ConnectionMade()
146-
147- def test_connection_made_no_info(self):
148- """Ensure db is called."""
149- self.connection_no_info()
150- self.mocker.replay()
151- self.manager.ConnectionMadeNoQOCInfo()
152-
153- def test_connection_made_no_info_no_cb(self):
154- """Ensure db is called."""
155- self.manager.connected_cb = None
156- self.mocker.replay()
157- self.manager.ConnectionMadeNoQOCInfo()
158-
159- def test_disconnection(self):
160- """Ensure db is called."""
161- self.disconnected()
162- self.mocker.replay()
163- self.manager.ConnectionLost()
164-
165- def test_disconnection_no_cb(self):
166- """Ensure db is called."""
167- self.manager.disconnected_cb = None
168- self.mocker.replay()
169- self.manager.ConnectionLost()
170
171=== modified file 'tests/syncdaemon/test_action_queue.py'
172--- tests/syncdaemon/test_action_queue.py 2012-02-06 15:32:28 +0000
173+++ tests/syncdaemon/test_action_queue.py 2012-02-10 13:42:19 +0000
174@@ -58,7 +58,7 @@
175 protocol_pb2,
176 request,
177 )
178-from ubuntuone.syncdaemon import states, interfaces, config
179+from ubuntuone.syncdaemon import interfaces, config
180 from ubuntuone.syncdaemon import action_queue
181 from ubuntuone.syncdaemon.action_queue import (
182 ActionQueue, ActionQueueCommand, ChangePublicAccess, CreateUDF,
183@@ -1295,109 +1295,6 @@
184 "host 1.2.3.4", "port 4321"))
185
186
187-class NetworkmanagerTestCase(FactoryBaseTestCase):
188- """Base test case generating a connected factory."""
189-
190- timeout = 15
191-
192- @defer.inlineCallbacks
193- def setUp(self):
194- """Init."""
195- yield super(NetworkmanagerTestCase, self).setUp()
196- self.action_queue.event_queue.push('SYS_NET_CONNECTED')
197- self.main.start()
198-
199- @defer.inlineCallbacks
200- def test_wrong_disconnect(self):
201- """Test factory's connection when SYS_NET_DISCONNECTED."""
202-
203- d1 = self.main.wait_for('SYS_CONNECTION_MADE')
204- d2 = self.main.wait_for('SYS_CONNECTION_LOST')
205-
206- self.server = self._start_sample_webserver()
207- self.user_connect()
208- yield d1
209-
210- self.action_queue.event_queue.push('SYS_NET_DISCONNECTED')
211- yield d2
212-
213- @defer.inlineCallbacks
214- def test_disconnect_twice(self):
215- """Test connection when SYS_NET_DISCONNECTED is received twice."""
216-
217- d1 = self.main.wait_for('SYS_CONNECTION_MADE')
218- d2 = self.main.wait_for('SYS_CONNECTION_LOST')
219-
220- self.server = self._start_sample_webserver()
221- self.user_connect()
222- yield d1
223-
224- self.action_queue.event_queue.push('SYS_NET_DISCONNECTED')
225- yield d2
226-
227- self.action_queue.event_queue.events = []
228- self.action_queue.event_queue.push('SYS_NET_DISCONNECTED')
229- self.assertEqual([('SYS_NET_DISCONNECTED', {})],
230- self.action_queue.event_queue.events,
231- 'No new events after a misplaced SYS_NET_DISCONNECTED')
232-
233- @defer.inlineCallbacks
234- def test_net_connected_if_already_connected(self):
235- """Test connection when SYS_NET_CONNECTED is received twice."""
236-
237- d1 = self.main.wait_for('SYS_CONNECTION_MADE')
238-
239- self.server = self._start_sample_webserver()
240- self.user_connect()
241- yield d1
242-
243- self.action_queue.event_queue.events = []
244- self.action_queue.event_queue.push('SYS_NET_CONNECTED')
245- self.assertEqual([('SYS_NET_CONNECTED', {})],
246- self.action_queue.event_queue.events,
247- 'No new events after a misplaced SYS_NET_CONNECTED')
248-
249- @defer.inlineCallbacks
250- def test_messy_mix(self):
251- """Test connection when a messy mix of events is received."""
252- orig_waiting = states.MAX_WAITING
253- states.MAX_WAITING = 1
254-
255- self.action_queue.event_queue.events = []
256- self.server = self._start_sample_webserver()
257-
258- conn_made = self.main.wait_for('SYS_CONNECTION_MADE')
259- self.user_connect()
260- yield conn_made
261-
262- events = ['SYS_NET_CONNECTED', 'SYS_NET_DISCONNECTED',
263- 'SYS_NET_CONNECTED', 'SYS_NET_CONNECTED',
264- 'SYS_NET_DISCONNECTED', 'SYS_NET_DISCONNECTED',
265- 'SYS_NET_CONNECTED']
266-
267- for i in events:
268- self.action_queue.event_queue.push(i)
269-
270- yield self.main.wait_for_nirvana()
271-
272- expected = ['SYS_NET_CONNECTED', # from the DBus fake NetworkManager
273- 'SYS_NET_CONNECTED', 'SYS_NET_DISCONNECTED',
274- 'SYS_CONNECTION_LOST', 'SYS_CONNECTION_RETRY',
275- 'SYS_NET_CONNECTED', 'SYS_NET_CONNECTED',
276- 'SYS_CONNECTION_MADE', 'SYS_NET_DISCONNECTED',
277- 'SYS_NET_DISCONNECTED']
278-
279- avoid = ('SYS_STATE_CHANGED', 'SYS_LOCAL_RESCAN_DONE',
280- 'SYS_PROTOCOL_VERSION_OK', 'SYS_SET_CAPABILITIES_OK',
281- 'SYS_AUTH_OK', 'SYS_SERVER_RESCAN_DONE')
282- actual = [event for (event, kwargs) in
283- self.action_queue.event_queue.events
284- if event not in avoid]
285- self.assertEqual(sorted(expected), sorted(actual))
286-
287- states.MAX_WAITING = orig_waiting
288-
289-
290 class ConnectedBaseTestCase(FactoryBaseTestCase):
291 """Base test case generating a connected factory."""
292
293
294=== modified file 'tests/syncdaemon/test_interaction_interfaces.py'
295--- tests/syncdaemon/test_interaction_interfaces.py 2012-01-17 20:00:44 +0000
296+++ tests/syncdaemon/test_interaction_interfaces.py 2012-02-10 13:42:19 +0000
297@@ -21,6 +21,7 @@
298
299 from twisted.internet import defer
300 from ubuntuone.devtools.handlers import MementoHandler
301+from ubuntu_sso.networkstate import ONLINE
302
303 from contrib.testing.testcase import (
304 FakeCommand,
305@@ -2208,7 +2209,21 @@
306 def test_rescan_from_scratch_missing_volume(self):
307 """Test for rescan_from_scratch with a non-existing volume."""
308 volume_id = object()
309- self.assertRaises(ValueError, self.sd_obj.rescan_from_scratch, volume_id)
310+ self.assertRaises(ValueError,
311+ self.sd_obj.rescan_from_scratch, volume_id)
312+
313+ def test_network_state_changed_with_connection(self):
314+ """Test the network_state changed method with a connection."""
315+ self.sd_obj.network_state_changed(ONLINE)
316+
317+ self.assertEqual(self.events, [('SYS_NET_CONNECTED', {})])
318+
319+ def test_network_state_changed_without_connection(self):
320+ """Test the network_state changed method without a connection."""
321+ # Sending anything instead of ONLINE should be interpreted as OFFLINE
322+ self.sd_obj.network_state_changed(object())
323+
324+ self.assertEqual(self.events, [('SYS_NET_DISCONNECTED', {})])
325
326 def test_network_connected(self):
327 """Test the network_connected method."""
328
329=== modified file 'tests/syncdaemon/test_states.py'
330--- tests/syncdaemon/test_states.py 2011-10-27 11:39:43 +0000
331+++ tests/syncdaemon/test_states.py 2012-02-10 13:42:19 +0000
332@@ -847,58 +847,6 @@
333 self.assertFalse(self.aq.queue.active)
334
335
336-class TestStateManagerPassToNetworkManager(Base):
337- """All network events should go to NetworkManager."""
338-
339- @defer.inlineCallbacks
340- def setUp(self):
341- yield super(TestStateManagerPassToNetworkManager,
342- self).setUp()
343-
344- # put a function in the middle to log calls
345- self.called_events = []
346- orig_on_event = self.sm.connection.on_event
347- def fake_on_event(event):
348- """Log the call and call original."""
349- self.called_events.append(event)
350- orig_on_event(event)
351- self.sm.connection.on_event = fake_on_event
352-
353- def _test(self, event):
354- """Generic test method."""
355- cnt = 0
356- for node in self.sm_nodes_ok:
357- cnt += 1
358- self.sm.state = node
359- self.sm.handle_default(event)
360- self.assertEqual(self.called_events, [event]*cnt)
361-
362- def test_net_connected(self):
363- """SYS_NET_CONNECTED should go to Connection no matter where."""
364- self._test('SYS_NET_CONNECTED')
365-
366- def test_user_connect(self):
367- """SYS_USER_CONNECT should go to Connection no matter where."""
368- self._test('SYS_USER_CONNECT')
369-
370- def test_net_disconnected(self):
371- """SYS_NET_DISCONNECTED should go to Connection no matter where."""
372- self._test('SYS_NET_DISCONNECTED')
373-
374- def test_user_disconnect(self):
375- """SYS_USER_DISCONNECT should go to Connection no matter where."""
376- self._test('SYS_USER_DISCONNECT')
377-
378- def test_connection_lost(self):
379- """SYS_CONNECTION_LOST should go to Connection no matter where."""
380- self._test('SYS_CONNECTION_LOST')
381-
382- def test_handshake_timeout(self):
383- """SYS_HANDSHAKE_TIMEOUT should go to Connection no matter where."""
384- self._test('SYS_HANDSHAKE_TIMEOUT')
385-
386-
387-
388 class TestStateManagerPassToQueueManager(Base):
389 """All queue events should go to QueueManager."""
390
391
392=== modified file 'ubuntuone/platform/__init__.py'
393--- ubuntuone/platform/__init__.py 2012-01-25 20:49:55 +0000
394+++ ubuntuone/platform/__init__.py 2012-02-10 13:42:19 +0000
395@@ -31,6 +31,7 @@
396 from ubuntuone.platform import linux
397 source = linux
398
399+# This imports needs to be here in order to belongs to this namespace
400 from ubuntuone.platform import credentials
401 from ubuntuone.platform import tools
402
403
404=== modified file 'ubuntuone/platform/linux/dbus_interface.py'
405--- ubuntuone/platform/linux/dbus_interface.py 2012-01-02 20:24:31 +0000
406+++ ubuntuone/platform/linux/dbus_interface.py 2012-02-10 13:42:19 +0000
407@@ -41,28 +41,6 @@
408 DBUS_IFACE_PUBLIC_FILES_NAME = DBUS_IFACE_NAME + '.PublicFiles'
409 DBUS_IFACE_LAUNCHER_NAME = DBUS_IFACE_NAME + '.Launcher'
410
411-# NetworkManager State constants
412-NM_STATE_UNKNOWN = 0
413-NM_STATE_ASLEEP_OLD = 1
414-NM_STATE_ASLEEP = 10
415-NM_STATE_CONNECTING_OLD = 2
416-NM_STATE_CONNECTING = 40
417-NM_STATE_CONNECTED_OLD = 3
418-NM_STATE_CONNECTED_LOCAL = 50
419-NM_STATE_CONNECTED_SITE = 60
420-NM_STATE_CONNECTED_GLOBAL = 70
421-NM_STATE_DISCONNECTED_OLD = 4
422-NM_STATE_DISCONNECTED = 20
423-
424-# NM state -> online/offline mapping
425-# Note that the LOCAL and SITE mappings are *not* a typo. Local and site links
426-# are not enough to connect to one.ubuntu.com, so we treat them as if we were
427-# not connected.
428-NM_STATE_ONLINE_EVENTS = [
429- NM_STATE_CONNECTED_OLD,
430- NM_STATE_CONNECTED_GLOBAL,
431-]
432-
433 logger = logging.getLogger("ubuntuone.SyncDaemon.DBus")
434
435
436@@ -859,39 +837,6 @@
437 self.config = Config(self.busName, service)
438 self.service = service
439
440- def error_handler(error):
441- """Handle errors from NM."""
442- logger.error("Error while getting the NetworkManager state %s",
443- error)
444- # If we get an error back from NetworkManager, we should
445- # just try to connect anyway; it probably means that
446- # NetworkManager is down or broken or something.
447- self.connection_state_changed(NM_STATE_CONNECTED_GLOBAL)
448- try:
449- nm = self.system_bus.get_object(
450- 'org.freedesktop.NetworkManager',
451- '/org/freedesktop/NetworkManager',
452- follow_name_owner_changes=True)
453- iface = dbus.Interface(nm, 'org.freedesktop.NetworkManager')
454- except dbus.DBusException, e:
455- if e.get_dbus_name() == \
456- 'org.freedesktop.DBus.Error.ServiceUnknown':
457- # NetworkManager isn't running.
458- logger.warn("Unable to connect to NetworkManager. "
459- "Assuming we have network.")
460- self.connection_state_changed(NM_STATE_CONNECTED_GLOBAL)
461- else:
462- raise
463- else:
464- iface.state(reply_handler=self.connection_state_changed,
465- error_handler=error_handler)
466-
467- # register a handler to NM StateChanged signal
468- self.system_bus.add_signal_receiver(self.connection_state_changed,
469- signal_name='StateChanged',
470- dbus_interface='org.freedesktop.NetworkManager',
471- path='/org/freedesktop/NetworkManager')
472-
473 logger.info('DBusInterface initialized.')
474
475 def shutdown(self, with_restart=False):
476@@ -905,11 +850,6 @@
477 self.config.remove_from_connection()
478 self.folders.remove_from_connection()
479 self.launcher.remove_from_connection()
480- # remove the NM's StateChanged signal receiver
481- self.system_bus.remove_signal_receiver(self.connection_state_changed,
482- signal_name='StateChanged',
483- dbus_interface='org.freedesktop.NetworkManager',
484- path='/org/freedesktop/NetworkManager')
485 self.bus.release_name(self.busName.get_name())
486 if with_restart:
487 # this is what activate_name_owner boils down to, except that
488@@ -931,10 +871,3 @@
489 not: there is nothing we can do about it.
490 """
491 _restart_error_handler = _restart_reply_handler
492-
493- def connection_state_changed(self, state):
494- """Push a connection state changed event to the Event Queue."""
495- if state in NM_STATE_ONLINE_EVENTS:
496- self.service.network_connected()
497- else:
498- self.service.network_disconnected()
499
500=== modified file 'ubuntuone/platform/windows/ipc.py'
501--- ubuntuone/platform/windows/ipc.py 2012-01-03 12:40:04 +0000
502+++ ubuntuone/platform/windows/ipc.py 2012-02-10 13:42:19 +0000
503@@ -21,7 +21,6 @@
504
505 from functools import wraps
506 from collections import defaultdict
507-from threading import Thread
508
509 from twisted.internet import defer, reactor
510 from twisted.spread.pb import (
511@@ -38,7 +37,6 @@
512 ActivationInstance,
513 AlreadyStartedError,
514 )
515-from ubuntuone.platform.windows.network_manager import NetworkManager
516
517 logger = logging.getLogger("ubuntuone.SyncDaemon.Pb")
518 LOCALHOST = "127.0.0.1"
519@@ -933,19 +931,6 @@
520 self.factory = PBServerFactory(self)
521 self.listener = ipc_server_listen(self.factory)
522
523- # register to future network changes
524- self.network_manager = NetworkManager(
525- connected_cb=service.network_connected,
526- disconnected_cb=service.network_disconnected)
527- self.network_manager_thread = Thread(
528- target=self.network_manager.register, name='Network changes')
529- self.network_manager_thread.daemon = True
530- self.network_manager_thread.start()
531-
532- # XXX: the current network manager is not calling network_connected
533- # for now, let's fake it
534- service.network_connected()
535-
536 logger.info('IPC initialized.')
537
538 def shutdown(self, with_restart=False):
539
540=== removed file 'ubuntuone/platform/windows/network_manager.py'
541--- ubuntuone/platform/windows/network_manager.py 2011-10-14 20:02:23 +0000
542+++ ubuntuone/platform/windows/network_manager.py 1970-01-01 00:00:00 +0000
543@@ -1,160 +0,0 @@
544-# -*- coding: utf-8 -*-
545-#
546-# Author: Manuel de la Pena<manuel@canonical.com>
547-#
548-# Copyright 2011 Canonical Ltd.
549-#
550-# This program is free software: you can redistribute it and/or modify it
551-# under the terms of the GNU General Public License version 3, as published
552-# by the Free Software Foundation.
553-#
554-# This program is distributed in the hope that it will be useful, but
555-# WITHOUT ANY WARRANTY; without even the implied warranties of
556-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
557-# PURPOSE. See the GNU General Public License for more details.
558-#
559-# You should have received a copy of the GNU General Public License along
560-# with this program. If not, see <http://www.gnu.org/licenses/>.
561-"""Implementation of a Network Mnager using ISesNework in Python."""
562-import logging
563-
564-import pythoncom
565-
566-from win32com.server.policy import DesignatedWrapPolicy
567-from win32com.client import Dispatch
568-
569-# set te logging to store the data in the ubuntuone folder
570-logger = logging.getLogger('ubuntuone.platform.windows.NetworkManager')
571-
572-## from EventSys.h
573-PROGID_EventSystem = "EventSystem.EventSystem"
574-PROGID_EventSubscription = "EventSystem.EventSubscription"
575-
576-# SENS (System Event Notification Service) values for the events,
577-# this events contain the uuid of the event, the name of the event to be used
578-# as well as the method name of the method in the ISesNetwork interface that
579-# will be executed for the event.
580-# For more ingo look at:
581-# http://msdn.microsoft.com/en-us/library/aa377384(v=vs.85).aspx
582-
583-SUBSCRIPTION_NETALIVE = ('{cd1dcbd6-a14d-4823-a0d2-8473afde360f}',
584- 'UbuntuOne Network Alive',
585- 'ConnectionMade')
586-
587-SUBSCRIPTION_NETALIVE_NOQOC = ('{a82f0e80-1305-400c-ba56-375ae04264a1}',
588- 'UbuntuOne Net Alive No Info',
589- 'ConnectionMadeNoQOCInfo')
590-
591-SUBSCRIPTION_NETLOST = ('{45233130-b6c3-44fb-a6af-487c47cee611}',
592- 'UbuntuOne Network Lost',
593- 'ConnectionLost')
594-
595-SUBSCRIPTION_REACH = ('{4c6b2afa-3235-4185-8558-57a7a922ac7b}',
596- 'UbuntuOne Network Reach',
597- 'ConnectionMade')
598-
599-SUBSCRIPTION_REACH_NOQOC = ('{db62fa23-4c3e-47a3-aef2-b843016177cf}',
600- 'UbuntuOne Network Reach No Info',
601- 'ConnectionMadeNoQOCInfo')
602-
603-SUBSCRIPTION_REACH_NOQOC2 = ('{d4d8097a-60c6-440d-a6da-918b619ae4b7}',
604- 'UbuntuOne Network Reach No Info 2',
605- 'ConnectionMadeNoQOCInfo')
606-
607-SUBSCRIPTIONS = [SUBSCRIPTION_NETALIVE,
608- SUBSCRIPTION_NETALIVE_NOQOC,
609- SUBSCRIPTION_NETLOST,
610- SUBSCRIPTION_REACH,
611- SUBSCRIPTION_REACH_NOQOC,
612- SUBSCRIPTION_REACH_NOQOC2]
613-
614-SENSGUID_EVENTCLASS_NETWORK = '{d5978620-5b9f-11d1-8dd2-00aa004abd5e}'
615-SENSGUID_PUBLISHER = "{5fee1bd6-5b9b-11d1-8dd2-00aa004abd5e}"
616-
617-# uuid of the implemented com interface
618-IID_ISesNetwork = '{d597bab1-5b9f-11d1-8dd2-00aa004abd5e}'
619-
620-
621-class NetworkManager(DesignatedWrapPolicy):
622- """Implement ISesNetwork to know about the network status."""
623-
624- _com_interfaces_ = [IID_ISesNetwork]
625- _public_methods_ = ['ConnectionMade',
626- 'ConnectionMadeNoQOCInfo',
627- 'ConnectionLost']
628- _reg_clsid_ = '{41B032DA-86B5-4907-A7F7-958E59333010}'
629- _reg_progid_ = "UbuntuOne.NetworkManager"
630-
631- def __init__(self, connected_cb=None, connected_cb_info=None,
632- disconnected_cb=None):
633- self._wrap_(self)
634- self.connected_cb = connected_cb
635- self.connected_cb_info = connected_cb_info
636- self.disconnected_cb = disconnected_cb
637-
638- def ConnectionMade(self, *args):
639- """Tell that the connection is up again."""
640- logger.info('Connection was made.')
641- if self.connected_cb_info:
642- self.connected_cb_info()
643-
644- def ConnectionMadeNoQOCInfo(self, *args):
645- """Tell that the connection is up again."""
646- logger.info('Connection was made no info.')
647- if self.connected_cb:
648- self.connected_cb()
649-
650- def ConnectionLost(self, *args):
651- """Tell the connection was lost."""
652- logger.info('Connection was lost.')
653- if self.disconnected_cb:
654- self.disconnected_cb()
655-
656- def register(self):
657- """Register to listen to network events."""
658- # call the CoInitialize to allow the registration to run in an other
659- # thread
660- pythoncom.CoInitialize()
661- # interface to be used by com
662- manager_interface = pythoncom.WrapObject(self)
663- event_system = Dispatch(PROGID_EventSystem)
664- # register to listent to each of the events to make sure that
665- # the code will work on all platforms.
666- for current_event in SUBSCRIPTIONS:
667- # create an event subscription and add it to the event
668- # service
669- event_subscription = Dispatch(PROGID_EventSubscription)
670- event_subscription.EventClassId = SENSGUID_EVENTCLASS_NETWORK
671- event_subscription.PublisherID = SENSGUID_PUBLISHER
672- event_subscription.SubscriptionID = current_event[0]
673- event_subscription.SubscriptionName = current_event[1]
674- event_subscription.MethodName = current_event[2]
675- event_subscription.SubscriberInterface = manager_interface
676- event_subscription.PerUser = True
677- # store the event
678- try:
679- event_system.Store(PROGID_EventSubscription,
680- event_subscription)
681- except pythoncom.com_error as e:
682- logger.error(
683- 'Error registering %s to event %s', e, current_event[1])
684-
685- pythoncom.PumpMessages()
686-
687-if __name__ == '__main__':
688- # Run an expample of the code so that the user can test the code in
689- # real life.
690- from threading import Thread
691-
692- def connected():
693- print 'Connected'
694-
695- def connected_info():
696- print 'Connected'
697-
698- def disconnected():
699- print 'Disconnected'
700-
701- manager = NetworkManager(connected, connected_info, disconnected)
702- p = Thread(target=manager.register)
703- p.start()
704
705=== modified file 'ubuntuone/syncdaemon/interaction_interfaces.py'
706--- ubuntuone/syncdaemon/interaction_interfaces.py 2012-01-15 19:31:07 +0000
707+++ ubuntuone/syncdaemon/interaction_interfaces.py 2012-02-10 13:42:19 +0000
708@@ -36,6 +36,8 @@
709
710 from twisted.internet import defer
711
712+from ubuntu_sso.networkstate import NetworkManagerState, ONLINE
713+
714 from ubuntuone.logger import log_call
715 from ubuntuone.platform import credentials, ExternalInterface
716 from ubuntuone.storageprotocol import request
717@@ -1150,6 +1152,9 @@
718 super(SyncdaemonService, self).__init__(main, interface)
719
720 self.send_events = send_events
721+ self.network_manager = NetworkManagerState(
722+ result_cb=self.network_state_changed)
723+ self.network_manager.find_online_state()
724
725 if interface is None:
726 self.interface = ExternalInterface(service=self)
727@@ -1283,6 +1288,14 @@
728 self.main.action_q.rescan_from_scratch(volume.volume_id)
729
730 @log_call(logger.debug)
731+ def network_state_changed(self, state):
732+ """Receive the connection state and call the proper function."""
733+ if state == ONLINE:
734+ self.network_connected()
735+ else:
736+ self.network_disconnected()
737+
738+ @log_call(logger.debug)
739 def network_connected(self):
740 """Push the connected event."""
741 self.main.event_q.push('SYS_NET_CONNECTED')
742
743=== modified file 'ubuntuone/syncdaemon/states.py'
744--- ubuntuone/syncdaemon/states.py 2011-10-14 20:02:23 +0000
745+++ ubuntuone/syncdaemon/states.py 2012-02-10 13:42:19 +0000
746@@ -400,7 +400,7 @@
747 self._state_changed()
748 return
749
750- # NetworkManager and User events
751+ # User events
752 if event in ('SYS_NET_CONNECTED', 'SYS_USER_CONNECT',
753 'SYS_NET_DISCONNECTED', 'SYS_USER_DISCONNECT',
754 'SYS_CONNECTION_LOST', 'SYS_HANDSHAKE_TIMEOUT'):

Subscribers

People subscribed via source and target branches