Merge lp:~mandel/ubuntuone-client/sdtool_start_method into lp:ubuntuone-client

Proposed by Manuel de la Peña
Status: Merged
Approved by: Natalia Bidart
Approved revision: 1066
Merged at revision: 1033
Proposed branch: lp:~mandel/ubuntuone-client/sdtool_start_method
Merge into: lp:ubuntuone-client
Diff against target: 473 lines (+91/-3)
2 files modified
tests/platform/windows/test_tools.py (+81/-2)
ubuntuone/platform/windows/tools.py (+10/-1)
To merge this branch: bzr merge lp:~mandel/ubuntuone-client/sdtool_start_method
Reviewer Review Type Date Requested Status
Natalia Bidart (community) Approve
Roberto Alsina (community) Approve
Review via email: mp+66448@code.launchpad.net

Commit message

Allows to start the syncdaemon by providing a start method to sdtool.

Description of the change

Allows to start the syncdaemon by providing a start method to sdtool. To tests please runthe following:

python C:\Python27\Scripts\u1trial --reactor=txnp tests\platform\windows\test_tools.py

In the method is correctly implemented you will see notepad being executed and close during the tests.

To post a comment you must log in.
Revision history for this message
Natalia Bidart (nataliabidart) wrote :

I'm getting this error:

===============================================================================
[ERROR]
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\twisted-11.0.0-py2.7-win32.egg\twisted\int
ernet\defer.py", line 1020, in _inlineCallbacks
    result = g.send(result)
  File "C:\Users\Test\src\review\tests\platform\windows\test_tools.py", line 111
3, in test_execution
    self.mocker.verify()
  File "build\bdist.win32\egg\mocker.py", line 645, in verify

exceptions.AssertionError: [Mocker] Unmet expectations:

=> _winreg.OpenKey(ANY, 'Software\\\\Ubuntu One')
 - Performed fewer times than expected.

=> _winreg.QueryValueEx(None, 'SyncDaemonInstallPath')
 - Performed fewer times than expected.

tests.platform.windows.test_tools.TestSyncDaemonTool.test_start
-------------------------------------------------------------------------------
Ran 51 tests in 2.265s

FAILED (errors=1, successes=50)

review: Needs Fixing
Revision history for this message
Natalia Bidart (nataliabidart) wrote :

I had the wrong PYTHONPATH set, tests actually pass. But can we please mock subcprocess to avoid having a notepad window being opened?

review: Needs Fixing
1065. By Manuel de la Peña

Mock subprocess so that we do not start a real app.

1066. By Manuel de la Peña

Merged with changes on linux.

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

Code looks ok, tests pass.

review: Approve
Revision history for this message
Natalia Bidart (nataliabidart) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'tests/platform/windows/test_tools.py'
2--- tests/platform/windows/test_tools.py 2011-06-23 16:33:20 +0000
3+++ tests/platform/windows/test_tools.py 2011-06-30 14:22:30 +0000
4@@ -24,7 +24,10 @@
5 PBServerFactory,
6 Root)
7
8-from ubuntuone.platform.windows.tools import SyncDaemonTool
9+from ubuntuone.platform.windows.tools import (
10+ SyncDaemonTool,
11+ U1_REG_PATH,
12+ SD_INSTALL_PATH)
13 from ubuntuone.platform.windows.ipc import (
14 Config,
15 Events,
16@@ -168,6 +171,7 @@
17 self.mocker.result(downloads)
18 self.mocker.replay()
19 result = yield sdtool.get_current_downloads()
20+ self.mocker.restore()
21 self.mocker.verify()
22 self.assertEqual(downloads, result)
23
24@@ -189,6 +193,7 @@
25 self.mocker.replay()
26 self.mocker.result(uploads)
27 result = yield sdtool.get_current_uploads()
28+ self.mocker.restore()
29 self.mocker.verify()
30 self.assertEqual(uploads, result)
31
32@@ -208,6 +213,7 @@
33 self.root.wait_for_nirvana(last_event_interval, ANY, ANY)
34 self.mocker.replay()
35 yield sdtool.wait_for_nirvana()
36+ self.mocker.restore()
37 self.mocker.verify()
38
39 d = self._connect()
40@@ -226,6 +232,7 @@
41 self.root.accept_share(share_id, ANY, ANY)
42 self.mocker.replay()
43 yield sdtool.accept_share(share_id)
44+ self.mocker.restore()
45 self.mocker.verify()
46
47 d = self._connect()
48@@ -244,6 +251,7 @@
49 self.root.reject_share(share_id, ANY, ANY)
50 self.mocker.replay()
51 yield sdtool.reject_share(share_id)
52+ self.mocker.restore()
53 self.mocker.verify()
54
55 d = self._connect()
56@@ -262,6 +270,7 @@
57 self.root.subscribe(share_id)
58 self.mocker.replay()
59 yield sdtool.subscribe_share(share_id)
60+ self.mocker.restore()
61 self.mocker.verify()
62
63 d = self._connect()
64@@ -280,6 +289,7 @@
65 self.root.unsubscribe(share_id)
66 self.mocker.replay()
67 yield sdtool.unsubscribe_share(share_id)
68+ self.mocker.restore()
69 self.mocker.verify()
70
71 d = self._connect()
72@@ -300,6 +310,7 @@
73 self.mocker.result(shares)
74 self.mocker.replay()
75 yield sdtool.get_shares()
76+ self.mocker.restore()
77 self.mocker.verify()
78
79 d = self._connect()
80@@ -317,6 +328,7 @@
81 self.root.refresh_shares()
82 self.mocker.replay()
83 yield sdtool.refresh_shares()
84+ self.mocker.restore()
85 self.mocker.verify()
86
87 d = self._connect()
88@@ -338,6 +350,7 @@
89 self.root.create_share(path, username, name, access_level)
90 self.mocker.replay()
91 yield sdtool.offer_share(path, username, name, access_level)
92+ self.mocker.restore()
93 self.mocker.verify()
94
95 d = self._connect()
96@@ -358,6 +371,7 @@
97 self.mocker.result(shares)
98 self.mocker.replay()
99 yield sdtool.list_shared()
100+ self.mocker.restore()
101 self.mocker.verify()
102
103 d = self._connect()
104@@ -376,6 +390,7 @@
105 self.root.create(path)
106 self.mocker.replay()
107 yield sdtool.create_folder(path)
108+ self.mocker.restore()
109 self.mocker.verify()
110
111 d = self._connect()
112@@ -394,6 +409,7 @@
113 self.root.delete(folder_id)
114 self.mocker.replay()
115 yield sdtool.delete_folder(folder_id)
116+ self.mocker.restore()
117 self.mocker.verify()
118
119 d = self._connect()
120@@ -412,6 +428,7 @@
121 self.root.subscribe(folder_id )
122 self.mocker.replay()
123 yield sdtool.subscribe_folder(folder_id )
124+ self.mocker.restore()
125 self.mocker.verify()
126
127 d = self._connect()
128@@ -430,6 +447,7 @@
129 self.root.unsubscribe(folder_id)
130 self.mocker.replay()
131 yield sdtool.unsubscribe_folder(folder_id)
132+ self.mocker.restore()
133 self.mocker.verify()
134
135 d = self._connect()
136@@ -450,6 +468,7 @@
137 self.mocker.result(folders)
138 self.mocker.replay()
139 yield sdtool.get_folders()
140+ self.mocker.restore()
141 self.mocker.verify()
142
143 d = self._connect()
144@@ -468,6 +487,7 @@
145 self.root.get_info(path)
146 self.mocker.replay()
147 yield client.get_folder_info(path)
148+ self.mocker.restore()
149 self.mocker.verify()
150
151 d = self._connect()
152@@ -486,6 +506,7 @@
153 self.root.get_metadata(path)
154 self.mocker.replay()
155 yield sdtool.get_metadata(path)
156+ self.mocker.restore()
157 self.mocker.verify()
158
159 d = self._connect()
160@@ -510,6 +531,7 @@
161 self.root.change_public_access(share_id, node_id, is_public)
162 self.mocker.replay()
163 yield sdtool.change_public_access(path, is_public)
164+ self.mocker.restore()
165 self.mocker.verify()
166
167 d = self._connect()
168@@ -529,6 +551,7 @@
169 self.root.quit(None, None)
170 self.mocker.replay()
171 yield sdtool.quit()
172+ self.mocker.restore()
173 self.mocker.verify()
174
175 d = self._connect()
176@@ -546,6 +569,7 @@
177 self.root.connect()
178 self.mocker.replay()
179 yield sdtool.connect()
180+ self.mocker.restore()
181 self.mocker.verify()
182
183 d = self._connect()
184@@ -563,6 +587,7 @@
185 self.root.disconnect()
186 self.mocker.replay()
187 yield sdtool.disconnect()
188+ self.mocker.restore()
189 self.mocker.verify()
190
191 d = self._connect()
192@@ -582,6 +607,7 @@
193 self.mocker.result(status)
194 self.mocker.replay()
195 yield sdtool.get_status()
196+ self.mocker.restore()
197 self.mocker.verify()
198
199 d = self._connect()
200@@ -600,6 +626,7 @@
201 self.mocker.result({})
202 self.mocker.replay()
203 yield sdtool.waiting()
204+ self.mocker.restore()
205 self.mocker.verify()
206
207 d = self._connect()
208@@ -617,6 +644,7 @@
209 self.root.waiting_metadata()
210 self.mocker.replay()
211 yield sdtool.waiting_metadata()
212+ self.mocker.restore()
213 self.mocker.verify()
214
215 d = self._connect()
216@@ -634,6 +662,7 @@
217 self.root.waiting_content()
218 self.mocker.replay()
219 yield sdtool.waiting_content()
220+ self.mocker.restore()
221 self.mocker.verify()
222
223 d = self._connect()
224@@ -651,6 +680,7 @@
225 self.root.get_throttling_limits(ANY, ANY)
226 self.mocker.replay()
227 yield sdtool.get_throttling_limits()
228+ self.mocker.restore()
229 self.mocker.verify()
230
231 d = self._connect()
232@@ -670,6 +700,7 @@
233 self.root.set_throttling_limits(download, upload, ANY, ANY)
234 self.mocker.replay()
235 yield sdtool.set_throttling_limits(download, upload)
236+ self.mocker.restore()
237 self.mocker.verify()
238
239 d = self._connect()
240@@ -688,6 +719,7 @@
241 self.mocker.result(True)
242 self.mocker.replay()
243 result = yield sdtool.is_throttling_enabled()
244+ self.mocker.restore()
245 self.mocker.verify()
246 self.assertTrue(result)
247
248@@ -706,6 +738,7 @@
249 self.root.enable_bandwidth_throttling(ANY, ANY)
250 self.mocker.replay()
251 yield sdtool.enable_throttling(True)
252+ self.mocker.restore()
253 self.mocker.verify()
254
255 d = self._connect()
256@@ -723,6 +756,7 @@
257 self.root.disable_bandwidth_throttling(ANY, ANY)
258 self.mocker.replay()
259 yield sdtool.enable_throttling(False)
260+ self.mocker.restore()
261 self.mocker.verify()
262
263 d = self._connect()
264@@ -741,6 +775,7 @@
265 self.mocker.replay()
266 self.mocker.result(True)
267 result = yield sdtool.is_autoconnect_enabled()
268+ self.mocker.restore()
269 self.mocker.verify()
270 self.assertTrue(result)
271
272@@ -760,6 +795,7 @@
273 self.root.set_autoconnect_enabled(enabled)
274 self.mocker.replay()
275 yield sdtool.enable_autoconnect(enabled)
276+ self.mocker.restore()
277 self.mocker.verify()
278
279 d = self._connect()
280@@ -778,6 +814,7 @@
281 self.mocker.result(True)
282 self.mocker.replay()
283 result = yield sdtool.is_show_all_notifications_enabled()
284+ self.mocker.restore()
285 self.mocker.verify()
286 self.assertTrue(result)
287
288@@ -796,6 +833,7 @@
289 self.root.enable_show_all_notifications()
290 self.mocker.replay()
291 yield sdtool.enable_show_all_notifications(True)
292+ self.mocker.restore()
293 self.mocker.verify()
294
295 d = self._connect()
296@@ -813,6 +851,7 @@
297 self.root.disable_show_all_notifications()
298 self.mocker.replay()
299 yield sdtool.enable_show_all_notifications(False)
300+ self.mocker.restore()
301 self.mocker.verify()
302
303 d = self._connect()
304@@ -831,6 +870,7 @@
305 self.mocker.result(True)
306 self.mocker.replay()
307 result = yield sdtool.is_share_autosubscribe_enabled()
308+ self.mocker.restore()
309 self.mocker.verify()
310 self.assertTrue(result)
311
312@@ -849,6 +889,7 @@
313 self.root.enable_share_autosubscribe()
314 self.mocker.replay()
315 yield sdtool.enable_share_autosubscribe(True)
316+ self.mocker.restore()
317 self.mocker.verify()
318
319 d = self._connect()
320@@ -866,6 +907,7 @@
321 self.root.disable_share_autosubscribe()
322 self.mocker.replay()
323 yield sdtool.enable_share_autosubscribe(False)
324+ self.mocker.restore()
325 self.mocker.verify()
326
327 d = self._connect()
328@@ -884,6 +926,7 @@
329 self.mocker.result(True)
330 self.mocker.replay()
331 result = yield sdtool.is_udf_autosubscribe_enabled()
332+ self.mocker.restore()
333 self.mocker.verify()
334 self.assertTrue(result)
335
336@@ -902,6 +945,7 @@
337 self.root.enable_udf_autosubscribe()
338 self.mocker.replay()
339 yield sdtool.enable_udf_autosubscribe(True)
340+ self.mocker.restore()
341 self.mocker.verify()
342
343 d = self._connect()
344@@ -919,6 +963,7 @@
345 self.root.disable_udf_autosubscribe()
346 self.mocker.replay()
347 yield sdtool.enable_udf_autosubscribe(False)
348+ self.mocker.restore()
349 self.mocker.verify()
350
351 d = self._connect()
352@@ -936,6 +981,7 @@
353 self.root.refresh_volumes()
354 self.mocker.replay()
355 yield sdtool.refresh_volumes()
356+ self.mocker.restore()
357 self.mocker.verify()
358
359 d = self._connect()
360@@ -954,6 +1000,7 @@
361 self.root.rescan_from_scratch(volume_id)
362 self.mocker.replay()
363 yield sdtool.rescan_from_scratch(volume_id)
364+ self.mocker.restore()
365 self.mocker.verify()
366
367 d = self._connect()
368@@ -973,6 +1020,7 @@
369 self.mocker.result(dirty_nodes)
370 self.mocker.replay()
371 result = yield sdtool.get_dirty_nodes()
372+ self.mocker.restore()
373 self.mocker.verify()
374 self.assertEqual(dirty_nodes, result)
375
376@@ -993,6 +1041,7 @@
377 self.mocker.result(root)
378 self.mocker.replay()
379 result = yield sdtool.get_root_dir()
380+ self.mocker.restore()
381 self.mocker.verify()
382 self.assertEqual(root, result)
383
384@@ -1013,6 +1062,7 @@
385 self.mocker.result(shares_dir)
386 self.mocker.replay()
387 result = yield sdtool.get_shares_dir()
388+ self.mocker.restore()
389 self.mocker.verify()
390 self.assertEqual(shares_dir, result)
391
392@@ -1033,6 +1083,7 @@
393 self.mocker.result(link)
394 self.mocker.replay()
395 result = yield sdtool.get_shares_dir_link()
396+ self.mocker.restore()
397 self.mocker.verify()
398 self.assertEqual(link, result)
399
400@@ -1040,4 +1091,32 @@
401 # pylint: disable=E1101
402 d.addCallback(test_execution)
403 # pylint: enable=E1101
404- return d
405+ return d
406+
407+ def test_start(self):
408+ """Test that we can indeed start the process."""
409+ cmd = 'notepad'
410+
411+ @defer.inlineCallbacks
412+ def test_execution(sdtool):
413+ """Actual test."""
414+ open_key = self.mocker.replace('_winreg.OpenKey')
415+ query_value = self.mocker.replace('_winreg.QueryValueEx')
416+ subprocess = self.mocker.replace('subprocess.Popen')
417+ # set the expectations
418+ open_key(ANY, U1_REG_PATH)
419+ query_value(None, SD_INSTALL_PATH)
420+ self.mocker.result([cmd,])
421+ subprocess([cmd,])
422+ self.mocker.result(cmd)
423+ self.mocker.replay()
424+ process = yield sdtool.start()
425+ self.mocker.restore()
426+ self.mocker.verify()
427+ self.assertEqual(cmd, process)
428+
429+ d = self._connect()
430+ # pylint: disable=E1101
431+ d.addCallback(test_execution)
432+ # pylint: enable=E1101
433+ return d
434\ No newline at end of file
435
436=== modified file 'ubuntuone/platform/windows/tools.py'
437--- ubuntuone/platform/windows/tools.py 2011-06-27 15:57:03 +0000
438+++ ubuntuone/platform/windows/tools.py 2011-06-30 14:22:30 +0000
439@@ -21,17 +21,21 @@
440
441 import logging
442 import time
443+import subprocess
444 import sys
445
446 from win32api import GetUserNameEx, CloseHandle
447 from win32con import NameSamCompatible
448 from win32file import CreateFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING
449 from twisted.internet import defer, reactor
450+from _winreg import OpenKey, HKEY_LOCAL_MACHINE, QueryValueEx
451
452 from ubuntuone.syncdaemon.config import get_user_config
453 from ubuntuone.platform.windows.ipc import NAMED_PIPE_URL
454 from ubuntuone.platform.windows.ipc_client import UbuntuOneClient
455
456+U1_REG_PATH = r'Software\\Ubuntu One'
457+SD_INSTALL_PATH = 'SyncDaemonInstallPath'
458
459 def is_running(bus=None):
460 """Check if there is a syncdaemon instance running.
461@@ -406,7 +410,12 @@
462 def start(self):
463 """Start syncdaemon if it's not running."""
464 if not is_running():
465- raise Exception('Not implemented yet!')
466+ # look in the reg to find the path of the .exe to be executed
467+ # to launch the sd on windows
468+ key = OpenKey(HKEY_LOCAL_MACHINE, U1_REG_PATH)
469+ path = QueryValueEx(key, SD_INSTALL_PATH)[0]
470+ p = subprocess.Popen([path,])
471+ return defer.succeed(p)
472 else:
473 return defer.succeed(None)
474

Subscribers

People subscribed via source and target branches